Docker images are now multi-architecture

With linux/amd64 and linux/arm64

Use Docker Compose 2.1.1 instead of Docker Compose 1.x
Reduce Docker images size, based on Alpine and Debian, again
This commit is contained in:
Tortue Torche 2021-11-30 17:52:51 +01:00
parent 159d9ca754
commit 539f2b2a4a
7 changed files with 43 additions and 21 deletions

View File

@ -11,6 +11,8 @@ variables:
PSU_TAG: $$CI_COMMIT_SHA
PSU_TAG_CORE: core-$$CI_COMMIT_SHA
DOCKER_REGISTRY_IMAGE: $DOCKER_REGISTRY/$CI_PROJECT_PATH
BUILDX_VERSION: "v0.7.1"
DOCKER_MULTI_ARCH: "linux/amd64,linux/arm64"
stages:
- cleanup
@ -28,6 +30,7 @@ stages:
variables:
- $CI_COMMIT_TAG == "dev"
script:
- setup_docker_multi_arch
- setup_docker
- registry_login
- cd ${CONTAINER_FOLDER:-.}
@ -38,10 +41,7 @@ stages:
echo "$CI_COMMIT_SHA";
fi)
export CONTAINER_COMMIT_SHA
- docker pull $CONTAINER_IMAGE:${CONTAINER_VERSION:-latest} || true
- docker build --pull $(if [[ -n "$DOCKER_CACHE_DISABLED" ]]; then echo "--no-cache "; else echo "--cache-from $CONTAINER_IMAGE:${CONTAINER_VERSION:-latest}"; fi) --file ${DOCKER_FILE:-Dockerfile} --tag $CONTAINER_IMAGE:$CONTAINER_COMMIT_SHA --tag $CONTAINER_IMAGE:${CONTAINER_VERSION:-latest} --build-arg HTTP_PROXY="$HTTP_PROXY" --build-arg http_proxy="$http_proxy" --build-arg HTTPS_PROXY="$HTTPS_PROXY" --build-arg https_proxy="$https_proxy" --build-arg FTP_PROXY="$FTP_PROXY" --build-arg ftp_proxy="$ftp_proxy" --build-arg NO_PROXY="$NO_PROXY" --build-arg no_proxy="$no_proxy" .
- docker push $CONTAINER_IMAGE:$CONTAINER_COMMIT_SHA
- docker push $CONTAINER_IMAGE:${CONTAINER_VERSION:-latest}
- docker buildx build --compress --push --platform $DOCKER_MULTI_ARCH --pull $(if [[ -n "$DOCKER_CACHE_DISABLED" ]]; then echo "--no-cache "; else echo "--cache-from $CONTAINER_IMAGE:${CONTAINER_VERSION:-latest}"; fi) --file ${DOCKER_FILE:-Dockerfile} --tag $CONTAINER_IMAGE:$CONTAINER_COMMIT_SHA --tag $CONTAINER_IMAGE:${CONTAINER_VERSION:-latest} --build-arg HTTP_PROXY="$HTTP_PROXY" --build-arg http_proxy="$http_proxy" --build-arg HTTPS_PROXY="$HTTPS_PROXY" --build-arg https_proxy="$https_proxy" --build-arg FTP_PROXY="$FTP_PROXY" --build-arg ftp_proxy="$ftp_proxy" --build-arg NO_PROXY="$NO_PROXY" --build-arg no_proxy="$no_proxy" .
build:main:
<<: *build_definition
@ -129,6 +129,7 @@ release:
variables:
- $CI_COMMIT_TAG == "dev"
script:
- setup_docker_multi_arch
- setup_docker
- registry_login
- external_registry_login

View File

@ -7,12 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
### Added
- Docker images are now multi-architecture (`linux/amd64` and `linux/arm64` 🦾)
- [macOS](https://apple.com/macos) support
- [Windows](https://microsoft.com/windows) support, but it could be unstable ⚠️
- Test <abbr title="Portainer Stack Utils">PSU</abbr> with Portainer <abbr title="Community Edition">CE</abbr> [2.9.3](https://app.swaggerhub.com/apis/portainer/portainer-ce/2.9.2) API
### Changed
- Upgrade Operating System of Docker based images, with [Alpine 3.15](https://hub.docker.com/_/alpine)
- Use Docker [Compose 2.1.1](https://github.com/docker/compose/releases/tag/v2.1.1) instead of Docker [Compose 1.x](https://github.com/docker/compose/releases/tag/1.28.0)
- Reduce Docker images size, based on Alpine and Debian, again
### Fixed
- Fix documentation scrolling between pages, with the [`auto2top`](https://docsify.js.org/#/configuration?id=auto2top) option of [docsify](https://docsify.js.org)

View File

@ -1,9 +1,13 @@
FROM alpine:3.15
FROM --platform=$BUILDPLATFORM alpine:3.15
ARG DOCKER_COMPOSE_VERSION="v2.1.1"
RUN set -e; \
apk add --no-cache \
bash ca-certificates curl docker-compose gettext jq; \
rm -rf $(find / -regex '.*\.py[co]')
bash ca-certificates curl gettext jq; \
\
curl --fail --location --silent "https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" --output /usr/local/bin/docker-compose; \
chmod +x /usr/local/bin/docker-compose
ENV LANG="en_US.UTF-8" \
LC_ALL="C.UTF-8" \

View File

@ -1,4 +1,4 @@
FROM alpine:3.15
FROM --platform=$BUILDPLATFORM alpine:3.15
RUN set -e; \
apk add --no-cache \

View File

@ -1,18 +1,17 @@
FROM debian:11-slim
FROM --platform=$BUILDPLATFORM debian:11-slim
ARG DOCKER_COMPOSE_VERSION=1.29.2
ARG DOCKER_COMPOSE_VERSION="v2.1.1"
RUN set -e; \
apt-get update -yqq; \
apt-get install \
ca-certificates curl gettext-base jq -yqq; \
\
curl --fail --silent --location "https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose; \
curl --fail --location --silent "https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" --output /usr/local/bin/docker-compose; \
chmod +x /usr/local/bin/docker-compose; \
\
apt-get clean; \
rm -rf /var/lib/apt/lists/*; \
rm -rf $(find / -regex '.*\.py[co]')
rm -rf /var/lib/apt/lists/*
ENV LANG="en_US.UTF-8" \
LC_ALL="C.UTF-8" \

View File

@ -1,4 +1,4 @@
FROM debian:11-slim
FROM --platform=$BUILDPLATFORM debian:11-slim
RUN set -e; \
apt-get update -yqq; \

View File

@ -26,6 +26,24 @@ function setup_docker() {
fi
}
function setup_docker_multi_arch() {
mkdir -p ~/.docker/cli-plugins/
current_system="$(uname -s | tr '[:upper:]' '[:lower:]')"
current_arch="$(uname -m)"
case $current_arch in
armv6*) current_arch="arm-v6";;
armv7*) current_arch="arm-v7";;
aarch64) current_arch="arm64";;
x86_64) current_arch="amd64";;
esac
curl --fail --location --silent "https://github.com/docker/buildx/releases/download/${BUILDX_VERSION}/buildx-${BUILDX_VERSION}.${current_system}-${current_arch}" --output ~/.docker/cli-plugins/docker-buildx
chmod a+x ~/.docker/cli-plugins/docker-buildx
docker context create multiarch
docker run --privileged --rm tonistiigi/binfmt --install all
docker buildx create --name multibuilder --use --platform $DOCKER_MULTI_ARCH multiarch
docker buildx inspect --bootstrap
}
function git_tag_on_success() {
local git_tag="${1:-dev}"
local target_branch="${2:-master}"
@ -61,13 +79,10 @@ function registry_tag_on_success() {
local target_external_registry_image="${6:-$DOCKER_REGISTRY_IMAGE}"
if [ "$CI_COMMIT_REF_NAME" == "$target_branch" ]; then
docker pull "$current_registry_image:$current_registry_tag"
docker tag "$current_registry_image:$current_registry_tag" "$target_registry_image:$target_registry_tag"
docker push "$target_registry_image:$target_registry_tag"
if [ -n "$target_external_registry_image" ]; then
docker tag "$current_registry_image:$current_registry_tag" "$target_external_registry_image:$target_registry_tag"
docker push "$target_external_registry_image:$target_registry_tag"
fi
echo -e "FROM --platform=\$BUILDPLATFORM $current_registry_image:$current_registry_tag
" > Dockerfile.tmp
docker buildx build --compress --push --platform $DOCKER_MULTI_ARCH --tag "$target_registry_image:$target_registry_tag" $(if [ -n "$DOCKER_REGISTRY" ] && [ -n "$target_external_registry_image" ]; then echo "--tag $target_external_registry_image:$target_registry_tag"; fi) --file Dockerfile.tmp .
rm -f Dockerfile.tmp
fi
}