GitLab CI / CD: создание многоархитектуры Docker изображений - PullRequest
2 голосов
/ 25 апреля 2020

Я хочу простой способ создания многоархатических 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.

Почему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...