Skip to content

Commit

Permalink
Extend Makefile and Dockerfiles to support multiarch builds for all G…
Browse files Browse the repository at this point in the history
…o binaries. (#1759)

* Extend Dockerfiles to support multiarch builds for all Go binaries.

By calling any of

make push-multiarch-./cmd/metaconvert/.uptodate
make push-multiarch-./cmd/mimir/.uptodate
make push-multiarch-./cmd/query-tee/.uptodate
make push-multiarch-./cmd/mimir-continuous-test/.uptodate
make push-multiarch-./cmd/mimirtool/.uptodate
make push-multiarch-./operations/mimir-rules-action/.uptodate

Signed-off-by: Peter Štibraný <[email protected]>
  • Loading branch information
pstibrany authored Apr 26, 2022
1 parent ccdada0 commit 533cef6
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 11 deletions.
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,9 +1,19 @@
cmd/mimirtool/mimirtool
cmd/mimirtool/mimirtool_linux_amd64
cmd/mimirtool/mimirtool_linux_arm64
cmd/test-exporter/test-exporter
cmd/mimir/mimir
cmd/mimir/mimir_linux_amd64
cmd/mimir/mimir_linux_arm64
cmd/query-tee/query-tee
cmd/query-tee/query-tee_linux_amd64
cmd/query-tee/query-tee_linux_arm64
cmd/metaconvert/metaconvert
cmd/metaconvert/metaconvert_linux_amd64
cmd/metaconvert/metaconvert_linux_arm64
cmd/mimir-continuous-test/mimir-continuous-test
cmd/mimir-continuous-test/mimir-continuous-test_linux_amd64
cmd/mimir-continuous-test/mimir-continuous-test_linux_arm64
.uptodate
.pkg
.cache
Expand Down
22 changes: 15 additions & 7 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -97,13 +97,18 @@ SED ?= $(shell which gsed 2>/dev/null || which sed)
@touch $@

# This target compiles mimir for linux/amd64 and linux/arm64 and then builds and pushes a multiarch image to the target repository.
# We don't separate building of single-platform and multiplatform images here (as we do for push-multiarch-build-image), as
# Mimir's Dockerfile is not doing much, and is unlikely to fail.
push-multiarch-mimir:
@echo
$(MAKE) GOOS=linux GOARCH=amd64 BINARY_SUFFIX=_linux_amd64 cmd/mimir/mimir
$(MAKE) GOOS=linux GOARCH=arm64 BINARY_SUFFIX=_linux_arm64 cmd/mimir/mimir
$(SUDO) docker buildx build -o type=registry --platform linux/amd64,linux/arm64 --build-arg=revision=$(GIT_REVISION) --build-arg=goproxyValue=$(GOPROXY_VALUE) --build-arg=USE_BINARY_SUFFIX=true -t $(IMAGE_PREFIX)mimir:$(IMAGE_TAG) cmd/mimir
# We don't do separate building of single-platform and multiplatform images here (as we do for push-multiarch-build-image), as
# these Dockerfiles are not doing much, and are unlikely to fail.
push-multiarch-%/$(UPTODATE):
$(eval DIR := $(patsubst push-multiarch-%/$(UPTODATE),%,$@))

if [ -f $(DIR)/main.go ]; then \
$(MAKE) GOOS=linux GOARCH=amd64 BINARY_SUFFIX=_linux_amd64 $(DIR)/$(shell basename $(DIR)); \
$(MAKE) GOOS=linux GOARCH=arm64 BINARY_SUFFIX=_linux_arm64 $(DIR)/$(shell basename $(DIR)); \
fi
$(SUDO) docker buildx build -o type=registry --platform linux/amd64,linux/arm64 --build-arg=revision=$(GIT_REVISION) --build-arg=goproxyValue=$(GOPROXY_VALUE) --build-arg=USE_BINARY_SUFFIX=true -t $(IMAGE_PREFIX)$(shell basename $(DIR)):$(IMAGE_TAG) $(DIR)/

push-multiarch-mimir: push-multiarch-cmd/mimir/.uptodate

# This target fetches current build image, and tags it with "latest" tag. It can be used instead of building the image locally.
.PHONY: fetch-build-image
Expand Down Expand Up @@ -396,6 +401,9 @@ format-makefiles: $(MAKE_FILES)
clean:
$(SUDO) docker rmi $(IMAGE_NAMES) >/dev/null 2>&1 || true
rm -rf -- $(UPTODATE_FILES) $(EXES) .cache dist
# Remove executables built for multiarch images.
find . -type f -name '*_linux_arm64' -perm +u+x -exec rm {} \;
find . -type f -name '*_linux_amd64' -perm +u+x -exec rm {} \;
go clean ./...

clean-protos:
Expand Down
8 changes: 7 additions & 1 deletion cmd/metaconvert/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,13 @@

FROM alpine:3.15.0
RUN apk add --no-cache ca-certificates
COPY metaconvert /
# Expose TARGETOS and TARGETARCH variables. These are supported by Docker when using BuildKit, but must be "enabled" using ARG.
ARG TARGETOS
ARG TARGETARCH
ARG BINARY_SUFFIX="_${TARGETOS}_${TARGETARCH}"
# Set to non-empty value to use ${TARGET_SUFFIX} when copying binary, leave unset to use no suffix.
ARG USE_BINARY_SUFFIX
COPY metaconvert${USE_BINARY_SUFFIX:+${BINARY_SUFFIX}} /metaconvert
ENTRYPOINT ["/metaconvert"]

ARG revision
Expand Down
8 changes: 7 additions & 1 deletion cmd/mimir-continuous-test/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,13 @@

FROM alpine:3.15.0
RUN apk add --no-cache ca-certificates
COPY mimir-continuous-test /
# Expose TARGETOS and TARGETARCH variables. These are supported by Docker when using BuildKit, but must be "enabled" using ARG.
ARG TARGETOS
ARG TARGETARCH
ARG BINARY_SUFFIX="_${TARGETOS}_${TARGETARCH}"
# Set to non-empty value to use ${TARGET_SUFFIX} when copying binary, leave unset to use no suffix.
ARG USE_BINARY_SUFFIX
COPY mimir-continuous-test${USE_BINARY_SUFFIX:+${BINARY_SUFFIX}} /mimir-continuous-test
ENTRYPOINT ["/mimir-continuous-test"]

ARG revision
Expand Down
2 changes: 1 addition & 1 deletion cmd/mimirtool/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ RUN apk add --no-cache ca-certificates
ARG TARGETOS
ARG TARGETARCH
ARG BINARY_SUFFIX="_${TARGETOS}_${TARGETARCH}"
# Set to non-empty value to use ${TARGET_SUFFIX} when copying mimir binary, leave unset to use no suffix.
# Set to non-empty value to use ${TARGET_SUFFIX} when copying binary, leave unset to use no suffix.
ARG USE_BINARY_SUFFIX
COPY mimirtool${USE_BINARY_SUFFIX:+${BINARY_SUFFIX}} /bin/mimirtool
ENTRYPOINT [ "/bin/mimirtool" ]
8 changes: 7 additions & 1 deletion cmd/query-tee/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,13 @@

FROM alpine:3.15.0
RUN apk add --no-cache ca-certificates
COPY query-tee /
# Expose TARGETOS and TARGETARCH variables. These are supported by Docker when using BuildKit, but must be "enabled" using ARG.
ARG TARGETOS
ARG TARGETARCH
ARG BINARY_SUFFIX="_${TARGETOS}_${TARGETARCH}"
# Set to non-empty value to use ${TARGET_SUFFIX} when copying binary, leave unset to use no suffix.
ARG USE_BINARY_SUFFIX
COPY query-tee${USE_BINARY_SUFFIX:+${BINARY_SUFFIX}} /query-tee
ENTRYPOINT ["/query-tee"]

ARG revision
Expand Down

0 comments on commit 533cef6

Please sign in to comment.