images/buildkitd.toml — конфиг BuildKit-демона, нужен docker-container builder'у для доверия корпоративным TLS-сертификатам registry. Копируется внутрь builder-контейнера только при его создании, поэтому при изменении сертификатов builder нужно пересоздавать (buildx rm + buildx create).
# images/buildkitd.toml
[registry."registry.example.com"]
ca = ["/etc/ssl/certs/ca-certificates.crt"]
[registry."mirror.example.com"]
ca = ["/etc/ssl/certs/ca-certificates.crt"]
# Taskfile.yml
---
version: "3"
vars:
PLATFORMS: '{{ .PLATFORMS | default "linux/amd64" }}'
tasks:
build:
desc: "Build image"
cmds:
- task: build-docker
buildx-setup:
desc: "Ensure buildx builder is ready (embedded BuildKit QEMU, no host binfmt_misc)"
run: once
cmds:
- docker buildx rm multiarch >/dev/null 2>&1 || true
- |
docker buildx create --name multiarch --driver docker-container \
--buildkitd-config {{ .WORKPATH }}/images/buildkitd.toml --use
- docker buildx inspect --bootstrap
build-docker:
desc: "Build all alpine docker images via bake"
deps:
- buildx-setup
cmds:
- echo "Build all docker images for platforms {{ .PLATFORMS }}:"
- |
set -e
OUT_MODE="--load"
[ -n "${CI:-}" ] && OUT_MODE="--push"
case "{{ .PLATFORMS }}" in
*,*)
if [ "$OUT_MODE" = "--load" ]; then
echo "Error: multi-platform build requires --push (CI only)." >&2
exit 1
fi
;;
esac
TAG={{ .TAG }} \
ARTIFACT_VERSION={{ .ARTIFACT_VERSION }} \
CI_REGISTRY_IMAGE={{ .CI_REGISTRY_IMAGE }} \
PROXY="${PROXY}" \
PLATFORMS={{ .PLATFORMS }} \
docker buildx bake --allow="fs.read=${HOME}/.netrc" \
-f {{ .WORKPATH }}/images/docker-bake.hcl $OUT_MODE
Пример локального запуска:
# Одна платформа (по умолчанию amd64), результат — в локальном docker images
task build
# Кросс-сборка под arm64, без запуска — только собрать и проверить, что Dockerfile валиден
task build PLATFORMS=linux/arm64
# Мультиарч — требует push, локально без CI-переменной завершится с ошибкой (см. логику OUT_MODE)
task build PLATFORMS=linux/amd64,linux/arm64 # упадёт локально без CI=true — так и задумано
.gitlab-ci.yml
# .gitlab-ci.yml
build-multiarch:
stage: build
image: registry.example.com/runner:${RUNNER_VERSION}
tags:
- dind-shared
variables:
DOCKER_HOST: tcp://docker:2375
DOCKER_TLS_CERTDIR: ""
before_script:
- docker info
- docker login -u "$USER" -p "$PASSWORD" "<REGISTRYURL>"
script:
- task build PLATFORMS=linux/amd64,linux/arm64