From 4c5c8d964583080e60c56526c04a9e37a4b7949e Mon Sep 17 00:00:00 2001 From: Egor Tensin Date: Tue, 28 Jan 2020 01:40:01 +0300 Subject: docker: multi-arch builds --- .travis.yml | 42 ++++++++++++++++++++++-- Makefile | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 144 insertions(+), 3 deletions(-) create mode 100644 Makefile diff --git a/.travis.yml b/.travis.yml index 02d7099..5c0b0c6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -59,7 +59,32 @@ jobs: - true script: - ./cmake/tools/clang-format.py --clang-format clang-format-9 - - name: Build Docker images + - name: Build and publish multi-arch images + language: minimal + addons: + apt: + update: true + # Newer docker for BuildKit/buildx support: + sources: + - key_url: 'https://download.docker.com/linux/ubuntu/gpg' + sourceline: 'deb https://download.docker.com/linux/ubuntu "$(lsb_release -cs)" stable' + packages: + - docker-ce + install: + # GCR & BuildKit don't work together, e.g.: + # https://github.com/moby/buildkit/issues/606 + - echo '{}' | sudo tee /etc/docker/daemon.json + - sudo systemctl restart docker + # Clear before_script: + before_script: + - true + script: |- + if [ "$TRAVIS_BRANCH" = master ]; then + make login && make builder/create && make push + else + make builder/create && make buildx + fi + - name: Build native images using Compose language: minimal # Don't install the unnecessary dependencies: addons: @@ -70,5 +95,16 @@ jobs: # Clear before_script: before_script: - true - script: - - docker-compose build + script: make compose-build + - name: Build native images using Docker + language: minimal + # Don't install the unnecessary dependencies: + addons: + apt: + update: false + services: + - docker + # Clear before_script: + before_script: + - true + script: make docker-build diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..9f3cb15 --- /dev/null +++ b/Makefile @@ -0,0 +1,105 @@ +# Various one-liners which I'm too lazy to remember. +# Basically a collection of really small shell scripts. + +PROJECT = math_server +# Enable buildx support: +export DOCKER_CLI_EXPERIMENTAL = enabled +# Target platforms (used by buildx): +platforms = linux/amd64,linux/armhf +# Docker Hub credentials: +DOCKER_USERNAME = egortensin + +all: build + +login: +ifndef DOCKER_PASSWORD + $(error Please define DOCKER_PASSWORD) +endif + @echo "$(DOCKER_PASSWORD)" | docker login --username "$(DOCKER_USERNAME)" --password-stdin + +# Re-register binfmt_misc formats with the F flag (required i.e. on Bionic): +fix-binfmt: + docker run --rm --privileged docker/binfmt:66f9012c56a8316f9244ffd7622d7c21c1f6f28d + +binfmt: fix-binfmt + +# `docker build` has week support for multiarch repos (you need to use multiple +# Dockerfile's, create a manifest manually, etc.), so it's only here for +# testing purposes, and native builds. +docker-build/%: +ifndef FORCE + $(warning Consider using `docker buildx` instead) +endif + docker build -f "$*/Dockerfile" -t "$(DOCKER_USERNAME)/math-$*" . + +docker-build: docker-build/client docker-build/server + +# `docker-compose build` has the same problems as `docker build`. +compose-build: +ifndef FORCE + $(warning Consider using `docker buildx` instead) +endif + docker-compose build + +# The simple way to build multiarch repos. +builder/create: fix-binfmt + docker buildx create --use --name "$(PROJECT)_builder" + +builder/rm: + docker buildx rm "$(PROJECT)_builder" + +buildx/%: + docker buildx build -f "$*/Dockerfile" -t "$(DOCKER_USERNAME)/math-$*" --platform "$(platforms)" --progress plain . + +buildx: buildx/client buildx/server + +# Build natively by default. +build: compose-build + +# `docker push` would replace the multiarch repo with a single image by default +# (you'd have to create a manifest and push it instead), so it's only here for +# testing purposes. +check-docker-push: +ifndef FORCE + $(error Please do not use `docker push`) +endif + +docker-push/%: check-docker-push docker-build/% + docker push "$(DOCKER_USERNAME)/math-$*" + +docker-push: check-docker-push docker-push/client docker-push/server + +# `docker-compose push` has the same problems as `docker push`. +check-compose-push: +ifndef FORCE + $(error Please do not use `docker-compose push`) +endif + +compose-push: check-compose-push compose-build + docker-compose push + +# The simple way to push multiarch repos. +buildx-push/%: + docker buildx build -f "$*/Dockerfile" -t "$(DOCKER_USERNAME)/math-$*" --platform "$(platforms)" --progress plain --push . + +buildx-push: buildx-push/client buildx-push/server + +# buildx is used by default. +push: buildx-push + +pull: + docker-compose pull + +up: + docker-compose up -d server + +run/client: + docker-compose --rm run client + +down: + docker-compose down --volumes + +clean: + docker system prune --all --force --volumes + +.PHONY: all login fix-binfmt binfmt docker-build compose-build builder/create builder/rm buildx build check-docker-push docker-push check-compose-push compose-push buildx-push push pull up run/client down clean -- cgit v1.2.3