Multiarch implementation for amd64, arm64 and arm32

This commit is contained in:
Mark Ison
2019-05-20 15:30:48 +01:00
parent e97d8464b9
commit e4ae9aac10
6 changed files with 131 additions and 18 deletions

21
.circleci/config.yml Normal file
View File

@@ -0,0 +1,21 @@
version: 2
jobs:
build:
machine: true
steps:
- checkout
#- run:
# name : Getting docker
# command: curl https://get.docker.com | sh
- run:
name: Enabling qemu
command: docker run --rm --privileged multiarch/qemu-user-static:register --reset
- run:
name: Building arm based image.
command: docker build -t arm-test .
- run:
name: Listing built images
command: docker images
# - run:
# name: Running arm based image.
# command: docker run --rm arm-test

View File

@@ -1,21 +1,51 @@
sudo: required
language: c
services:
- docker
addons:
apt:
packages:
- docker-ce
- qemu-user-static
env:
global:
- NAME=phusion/baseimage
# - VERSION=${TRAVIS_TAG}
- VERSION=${TRAVIS_BRANCH}
- DOCKER_CLI_EXPERIMENTAL=enabled
- QEMU_VERSION=v4.0.0
matrix:
# PLATFORM = Base image architecture to be used
# QEMU_ARCH = qemu binary to be downloaded from https://github.com/multiarch/qemu-user-static/releases
# TAG_ARCH = Tag to be applied to the image when upload to DockerHub
- PLATFORM=amd64 QEMU_ARCH=amd64 TAG_ARCH=amd64
- PLATFORM=arm64 QEMU_ARCH=aarch64 TAG_ARCH=arm64
- PLATFORM=arm QEMU_ARCH=arm TAG_ARCH=arm
stage: Compile
before_script:
- echo '{"experimental":true}' | sudo tee /etc/docker/daemon.json
- sudo service docker restart
script:
- docker login -u "${DOCKER_USERNAME}" -p "${DOCKER_PASSWORD}";
- make build test
after_success:
- docker login -u "${DOCKER_USERNAME}" -p "${DOCKER_PASSWORD}";
docker push ${NAME}:${VERSION};
# - if [ "${TRAVIS_BRANCH}" == "master" ]; then
# docker tag ${NAME}:${VERSION} ${NAME}:latest
# docker push ${NAME}:latest;
# fi
- if [[ $TRAVIS_PULL_REQUEST == 'false' ]]; then
make release;
fi
jobs:
include:
- stage: deploy
env:
- ARCHS="amd64 arm64 arm"
script:
- echo $NAME:$VERSION_TAG
- echo "$DOCKER_PASSWORD" | docker login --username "$DOCKER_USERNAME" --password-stdin
- ./build-multiarch.sh

View File

@@ -1,35 +1,48 @@
VERSION ?= 0.11
ifdef BASE_IMAGE
BUILD_ARG = --build-arg BASE_IMAGE=$(BASE_IMAGE)
ifndef NAME
NAME = phusion/baseimage-$(subst :,-,${BASE_IMAGE})
endif
ifndef NAME
NAME = phusion/baseimage-$(subst :,-,${BASE_IMAGE})
endif
else
NAME ?= phusion/baseimage
endif
VERSION ?= 0.11
ifdef TAG_ARCH
# VERSION_ARG = $(VERSION)-$(subst /,-,$(subst :,-,${BASE_IMAGE}))-$(TAG_ARCH)
VERSION_ARG = $(VERSION)-$(TAG_ARCH)
LATEST_VERSION = latest-$(TAG_ARCH)
else
# VERSION_ARG = $(VERSION)-$(subst /,-,$(subst :,-,${BASE_IMAGE}))
VERSION_ARG = $(VERSION)
LATEST_VERSION = latest
endif
VERSION_ARG ?= $(VERSION)
.PHONY: all build test tag_latest release ssh
all: build
build:
docker build -t $(NAME):$(VERSION) $(BUILD_ARG) --rm image
./build.sh
docker build --no-cache -t $(NAME):$(VERSION_ARG) $(BUILD_ARG) --build-arg QEMU_ARCH=$(QEMU_ARCH) --platform $(PLATFORM) --rm image
test:
env NAME=$(NAME) VERSION=$(VERSION) ./test/runner.sh
env NAME=$(NAME) VERSION=$(VERSION_ARG) ./test/runner.sh
tag_latest:
docker tag $(NAME):$(VERSION) $(NAME):latest
docker tag $(NAME):$(VERSION_ARG) $(NAME):$(LATEST_VERSION)
tag_multiarch_latest:
env TAG_LATEST=true ./build-multiarch.sh
release: test tag_latest
@if ! docker images $(NAME) | awk '{ print $$2 }' | grep -q -F $(VERSION); then echo "$(NAME) version $(VERSION) is not yet built. Please run 'make build'"; false; fi
@if ! docker images $(NAME) | awk '{ print $$2 }' | grep -q -F $(VERSION_ARG); then echo "$(NAME) version $(VERSION_ARG) is not yet built. Please run 'make build'"; false; fi
docker push $(NAME)
@echo "*** Don't forget to create a tag by creating an official GitHub release."
ssh: SSH_COMMAND?=
ssh:
ID=$$(docker ps | grep -F "$(NAME):$(VERSION)" | awk '{ print $$1 }') && \
ID=$$(docker ps | grep -F "$(NAME):$(VERSION_ARG)" | awk '{ print $$1 }') && \
if test "$$ID" = ""; then echo "Container is not running."; exit 1; fi && \
tools/docker-ssh $$ID ${SSH_COMMAND}

27
build-multiarch.sh Executable file
View File

@@ -0,0 +1,27 @@
#!/bin/bash
set -e
set -x
if [[ $TRAVIS_PULL_REQUEST == 'false' ]]; then
for arch in $ARCHS; do
echo ${arch}
docker pull $NAME:$VERSION-${arch}
if [[ $TAG_LATEST != 'true' ]]; then
docker manifest create --amend $NAME:$VERSION $NAME:$VERSION-${arch}
docker manifest annotate $NAME:$VERSION $NAME:$VERSION-${arch} --arch ${arch}
else
docker manifest create --amend $NAME:latest $NAME:$VERSION-${arch}
docker manifest annotate $NAME:latest $NAME:$VERSION-${arch} --arch ${arch}
fi
done
echo "Push manifests"
if [[ $TAG_LATEST != 'true' ]]; then
docker manifest push $NAME:$VERSION
else
docker manifest push $NAME:latest
fi
fi

19
build.sh Executable file
View File

@@ -0,0 +1,19 @@
#!/bin/bash
set -e
# # Prepare qemu
# if [ '$QEMU_ARCH' != 'amd64' ]; then
# # docker run --rm --privileged multiarch/qemu-user-static:register --reset
# fi
# Get qemu package
echo "Getting qemu package for $QEMU_ARCH"
# Fake qemu for amd64 builds to avoid breaking COPY in Dockerfile
if [ $QEMU_ARCH == 'amd64' ]; then
touch x86_64_qemu-"$QEMU_ARCH"-static.tar.gz
mv x86_64_qemu-${QEMU_ARCH}-static.tar.gz image
else
curl -L -o x86_64_qemu-"$QEMU_ARCH"-static.tar.gz https://github.com/multiarch/qemu-user-static/releases/download/"$QEMU_VERSION"/x86_64_qemu-"$QEMU_ARCH"-static.tar.gz
mv x86_64_qemu-${QEMU_ARCH}-static.tar.gz image
fi

View File

@@ -2,6 +2,9 @@ ARG BASE_IMAGE=ubuntu:18.04
FROM $BASE_IMAGE
MAINTAINER Phusion <info@phusion.nl>
ARG QEMU_ARCH
ADD x86_64_qemu-${QEMU_ARCH}-static.tar.gz /usr/bin
COPY . /bd_build
RUN /bd_build/prepare.sh && \