Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Extend Makefile and Dockerfiles to support multiarch builds for all Go binaries. #1759

Merged
merged 2 commits into from
Apr 26, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
23 changes: 16 additions & 7 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -97,13 +97,19 @@ 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),%,$@))
$(eval EXE := $(patsubst push-multiarch-%/$(UPTODATE),%,$@))
pstibrany marked this conversation as resolved.
Show resolved Hide resolved

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 +402,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