Я хочу простой способ создания многоархатических Docker изображений в GitLab Runner. Проще говоря, я имею в виду, что мне просто нужно добавить .gitlab-ci.yml в мой проект, и он будет работать.
Вот .gitlab-ci.yml, который я написал. Он создает многоархатный образ с помощью buildx, а затем отправляет его в реестр GitLab:
image: cl00e9ment/buildx
services:
- name: docker:dind
variables:
PLATFORMS: linux/amd64,linux/arm64
TAG: latest
before_script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"
build:
stage: build
script:
- docker buildx build --platform "$PLATFORMS" -t "${CI_REGISTRY_IMAGE}:${TAG}" . --push
Проблема в том, что платформа linux / arm64 недоступна.
Вот как я построил образ cl00e9ment / buildx (вдохновлен snadn / docker -buildx ):
Вот файл Docker:
FROM docker:latest
ENV DOCKER_CLI_EXPERIMENTAL=enabled
ENV DOCKER_HOST=tcp://docker:2375/
RUN mkdir -p ~/.docker/cli-plugins \
&& wget -qO- https://api.github.com/repos/docker/buildx/releases/latest | grep "browser_download_url.*linux-amd64" | cut -d : -f 2,3 | tr -d '"' | xargs wget -O ~/.docker/cli-plugins/docker-buildx \
&& chmod a+x ~/.docker/cli-plugins/docker-buildx
RUN docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
RUN docker context create buildx \
&& docker buildx create buildx --name mybuilder \
&& docker buildx use mybuilder
RUN docker buildx inspect --bootstrap
... добавить сюда файл .gitlab-ci.yml, использованный для сборки и создания sh образа cl00e9ment / buildx:
image: docker:latest
services:
- name: docker:dind
before_script:
- docker login -u cl00e9ment -p "$DOCKER_HUB_TOKEN"
build:
stage: build
script:
- docker build --add-host docker:`grep docker /etc/hosts | awk 'NR==1{print $1}'` --network host -t cl00e9ment/buildx .
- docker run --add-host docker:`grep docker /etc/hosts | awk 'NR==1{print $1}'` --network host cl00e9ment/buildx docker buildx inspect --bootstrap
- docker push cl00e9ment/buildx
test:
stage: test
script:
- docker run --add-host docker:`grep docker /etc/hosts | awk 'NR==1{print $1}'` --network host cl00e9ment/buildx docker buildx inspect --bootstrap
Так что же происходит?
- В конце сборки в Dockerfile я запускаю
docker buildx inspect --bootstrap
, чтобы просмотреть список доступных платформ. Это дает linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
. Так что все хорошо. - После этого я запускаю его снова (сразу после сборки и перед пу sh), и он все равно дает
linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
. - Однако на Этап тестирования, когда изображение только что загружено из Docker Hub в чистой среде, дает
linux/amd64, linux/386
.
Почему?