Skip to content

Commit 58f042d

Browse files
daixiang0GiedriusS
andauthored
support build docker images for arm64 arch (thanos-io#1906)
* Support build docker images for arm64 arch Signed-off-by: Xiang Dai <[email protected]> * Use Dockerfile.multi-stage Signed-off-by: Long Dai <[email protected]> * CHANGELOG: fix entry Signed-off-by: Giedrius Statkevičius <[email protected]> * Makefile: fix SHA values Signed-off-by: Giedrius Statkevičius <[email protected]> * .circleci: create new manifest after pushing image Only create a manifest & push it after pushing images with the new names. Signed-off-by: Giedrius Statkevičius <[email protected]> * fix revert issue Signed-off-by: Loong <[email protected]> * update Signed-off-by: Loong <[email protected]> * add crossbuild Signed-off-by: Loong <[email protected]> * Dockerfile.multi-arch: update SHA Signed-off-by: Giedrius Statkevičius <[email protected]> * .dockerignore: remove .promu Signed-off-by: Giedrius Statkevičius <[email protected]> * add logic for main Signed-off-by: Loong <[email protected]> * Makefile: use $(shell) for getting value Signed-off-by: Giedrius Statkevičius <[email protected]> Co-authored-by: Giedrius Statkevičius <[email protected]> Co-authored-by: Loong <[email protected]>
1 parent 9a26b0e commit 58f042d

File tree

4 files changed

+74
-14
lines changed

4 files changed

+74
-14
lines changed

.circleci/config.yml

+16-9
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ jobs:
2222
- checkout
2323
- go/mod-download-cached
2424
- setup_remote_docker:
25-
version: 17.07.0-ce
25+
version: 18.06.0-ce
2626
- run:
2727
name: Create Secret if PR is not forked
2828
# GCS integration tests are run only for author's PR that have write access, because these tests
@@ -74,39 +74,46 @@ jobs:
7474
- checkout
7575
- go/mod-download-cached
7676
- setup_remote_docker:
77-
version: 17.07.0-ce
77+
version: 18.06.0-ce
7878
- attach_workspace:
7979
at: .
80-
- run: ln -s .build/linux-amd64/thanos thanos
81-
- run: make docker
82-
- run: docker run thanos --help
80+
# Register qemu to support multi-arch.
81+
- run: docker run --privileged linuxkit/binfmt:v0.7
82+
- run: make crossbuild
83+
- run: make docker-build
84+
- run: make docker-test
8385
# Upload to both dockerhub and quay.io.
8486
- run: echo "${DOCKERHUB_PASSWORD}" | docker login -u="${DOCKERHUB_USERNAME}" --password-stdin
8587
- run: make docker-push DOCKER_IMAGE_REPO=thanosio/thanos
88+
- run: make docker-manifest DOCKER_IMAGE_REPO=thanosio/thanos
8689
- run: echo "${QUAY_PASSWORD}" | docker login -u="${QUAY_USERNAME}" quay.io --password-stdin
8790
- run: make docker-push
91+
- run: make docker-manifest
8892

8993
publish_release:
9094
executor: golang
9195
steps:
9296
- checkout
9397
- go/mod-download-cached
9498
- setup_remote_docker:
95-
version: 17.07.0-ce
99+
version: 18.06.0-ce
96100
- attach_workspace:
97101
at: .
98102
- run: make tarballs-release
99103
- store_artifacts:
100104
path: .tarballs
101105
destination: releases
102-
- run: ln -s .build/linux-amd64/thanos thanos
103-
- run: make docker
104-
- run: docker run thanos --help
106+
# Register qemu to support multi-arch.
107+
- run: docker run --privileged linuxkit/binfmt:v0.7
108+
- run: make docker-build
109+
- run: make docker-test
105110
# Upload to both dockerhub and quay.io.
106111
- run: echo "${DOCKERHUB_PASSWORD}" | docker login -u="${DOCKERHUB_USERNAME}" --password-stdin
107112
- run: make docker-push DOCKER_IMAGE_REPO=thanosio/thanos DOCKER_IMAGE_TAG=$CIRCLE_TAG
113+
- run: make docker-manifest DOCKER_IMAGE_REPO=thanosio/thanos DOCKER_IMAGE_TAG=$CIRCLE_TAG
108114
- run: echo "${QUAY_PASSWORD}" | docker login -u="${QUAY_USERNAME}" quay.io --password-stdin
109115
- run: make docker-push DOCKER_IMAGE_TAG=$CIRCLE_TAG
116+
- run: make docker-manifest DOCKER_IMAGE_TAG=$CIRCLE_TAG
110117

111118
workflows:
112119
version: 2

.dockerignore

-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ data/
1414
test/e2e/e2e_integration_test*
1515

1616
# Ignore promu artifacts.
17-
/.build
1817
/.release
1918
/.tarballs
2019

Dockerfile.multi-arch

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# By default we pin to amd64 sha. Use make docker to automatically adjust for arm64 versions.
2+
ARG BASE_DOCKER_SHA="97a9aacc097e5dbdec33b0d671adea0785e76d26ff2b979ee28570baf6a9155d"
3+
4+
FROM quay.io/prometheus/busybox@sha256:${BASE_DOCKER_SHA}
5+
LABEL maintainer="The Thanos Authors"
6+
7+
ARG ARCH="amd64"
8+
ARG OS="linux"
9+
10+
COPY .build/${OS}-${ARCH}/thanos /bin/thanos
11+
12+
ENTRYPOINT [ "/bin/thanos" ]

Makefile

+46-4
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,24 @@ arch = $(shell uname -m)
1212
# just visit https://quay.io/repository/prometheus/busybox?tag=latest&tab=tags.
1313
# TODO(bwplotka): Pinning is important but somehow quay kills the old images, so make sure to update regularly.
1414
# Update at 2021.12.08
15+
AMD64_SHA="97a9aacc097e5dbdec33b0d671adea0785e76d26ff2b979ee28570baf6a9155d"
16+
ARM64_SHA="5feb736d32e5b57f4944691d00b581f1f9192b3732cab03e3b6034cf0d1c8f2c"
17+
1518
ifeq ($(arch), x86_64)
1619
# amd64
17-
BASE_DOCKER_SHA="97a9aacc097e5dbdec33b0d671adea0785e76d26ff2b979ee28570baf6a9155d"
20+
BASE_DOCKER_SHA=$(AMD64_SHA)
1821
else ifeq ($(arch), armv8)
1922
# arm64
20-
BASE_DOCKER_SHA="5feb736d32e5b57f4944691d00b581f1f9192b3732cab03e3b6034cf0d1c8f2c"
23+
BASE_DOCKER_SHA=$(ARM64_SHA)
2124
else
2225
echo >&2 "only support amd64 or arm64 arch" && exit 1
2326
endif
27+
DOCKER_ARCHS ?= amd64 arm64
28+
# Generate two target: docker-xxx-amd64, docker-xxx-arm64.
29+
# Run make docker-xxx -n to see the result with dry run.
30+
BUILD_DOCKER_ARCHS = $(addprefix docker-build-,$(DOCKER_ARCHS))
31+
TEST_DOCKER_ARCHS = $(addprefix docker-test-,$(DOCKER_ARCHS))
32+
PUSH_DOCKER_ARCHS = $(addprefix docker-push-,$(DOCKER_ARCHS))
2433

2534
# Ensure everything works even if GOPATH is not set, which is often the case.
2635
# The `go env GOPATH` will work for all cases for Go 1.8+.
@@ -134,11 +143,20 @@ build: check-git deps $(PROMU)
134143
@echo ">> building Thanos binary in $(PREFIX)"
135144
@$(PROMU) build --prefix $(PREFIX)
136145

146+
GIT_BRANCH=$(shell $(GIT) rev-parse --abbrev-ref HEAD)
137147
.PHONY: crossbuild
138148
crossbuild: ## Builds all binaries for all platforms.
149+
ifeq ($(GIT_BRANCH), main)
150+
crossbuild: | $(PROMU)
151+
@echo ">> crossbuilding all binaries"
152+
# we only care about below two for the main branch
153+
$(PROMU) crossbuild -v -p linux/amd64 -p linux/arm64
154+
else
139155
crossbuild: | $(PROMU)
140156
@echo ">> crossbuilding all binaries"
141157
$(PROMU) crossbuild -v
158+
endif
159+
142160

143161
.PHONY: deps
144162
deps: ## Ensures fresh go.mod and go.sum.
@@ -164,9 +182,33 @@ docker-multi-stage:
164182
@echo ">> building docker image 'thanos' with Dockerfile.multi-stage"
165183
@docker build -f Dockerfile.multi-stage -t "thanos" --build-arg BASE_DOCKER_SHA=$(BASE_DOCKER_SHA) .
166184

167-
.PHONY: docker-push
185+
GET_SHA = $(shell echo '$1'_SHA | tr '[:lower:]' '[:upper:]')
186+
# docker-build builds docker images with multiple architectures.
187+
.PHONY: docker-build $(BUILD_DOCKER_ARCHS)
188+
docker-build: $(BUILD_DOCKER_ARCHS)
189+
$(BUILD_DOCKER_ARCHS): docker-build-%:
190+
@docker build -t "$(DOCKER_IMAGE_REPO)-linux-$*:$(DOCKER_IMAGE_TAG)" \
191+
--build-arg BASE_DOCKER_SHA=$($(call GET_SHA,$*)) \
192+
--build-arg ARCH="$*" \
193+
-f Dockerfile.multi-arch .
194+
195+
.PHONY: docker-test $(TEST_DOCKER_ARCHS)
196+
docker-test: $(TEST_DOCKER_ARCHS)
197+
$(TEST_DOCKER_ARCHS): docker-test-%:
198+
@echo ">> testing image"
199+
@docker run "$(DOCKER_IMAGE_REPO)-linux-$*:$(DOCKER_IMAGE_TAG)" --help
200+
201+
# docker-manifest push docker manifest to support multiple architectures.
202+
.PHONY: docker-manifest
203+
docker-manifest:
204+
@echo ">> creating and pushing manifest"
205+
@DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_IMAGE_REPO):$(DOCKER_IMAGE_TAG)" $(foreach ARCH,$(DOCKER_ARCHS),$(DOCKER_IMAGE_REPO)-linux-$(ARCH):$(DOCKER_IMAGE_TAG))
206+
@DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "$(DOCKER_IMAGE_REPO):$(DOCKER_IMAGE_TAG)"
207+
208+
.PHONY: docker-push $(PUSH_DOCKER_ARCHS)
168209
docker-push: ## Pushes 'thanos' docker image build to "$(DOCKER_IMAGE_REPO):$(DOCKER_IMAGE_TAG)".
169-
docker-push:
210+
docker-push: $(PUSH_DOCKER_ARCHS)
211+
$(PUSH_DOCKER_ARCHS): docker-push-%:
170212
@echo ">> pushing image"
171213
@docker tag "thanos" "$(DOCKER_IMAGE_REPO):$(DOCKER_IMAGE_TAG)"
172214
@docker push "$(DOCKER_IMAGE_REPO):$(DOCKER_IMAGE_TAG)"

0 commit comments

Comments
 (0)