GitLab CI - 尝试使用docker buildx构建ARM64版本

11
尝试使用GitLabs共享运行器和docker buildx构建Docker镜像,以在树莓派上运行。作业失败,提示PATH中找不到git,但image: docker:stable-git中已安装了git。是否有已知的解决方法或更好的方式来构建ARM64兼容的镜像,而无需在树莓派本身上进行构建?(由于CPU使用率过高,RPi在构建时变得无法使用)
deploy:
  image: docker:stable-git
  stage: deploy
  services:
    - docker:dind
  before_script:
    - export DOCKER_BUILDKIT=1
    - export DOCKER_CLI_EXPERIMENTAL=enabled
    - docker build --platform=local -o . git://github.com/docker/buildx
    - mv buildx ~/.docker/cli-plugins/docker-buildx
  script:
    - docker buildx build --platform linux/amd64,linux/arm64 -t $CI_REGISTRY_IMAGE .
    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
    - docker push $CI_REGISTRY_IMAGE

$ export DOCKER_BUILDKIT=1
$ export DOCKER_CLI_EXPERIMENTAL=enabled
$ docker build --platform=local -o . git://github.com/docker/buildx
#1 [internal] load git source git://github.com/docker/buildx
#1 ERROR: failed to init repo at /var/lib/docker/overlay2/xxx/diff: exec: "git": executable file not found in $PATH
------
 > [internal] load git source git://github.com/docker/buildx:
------
failed to solve with frontend dockerfile.v0: failed to resolve dockerfile: failed to build LLB: failed to load cache key: failed to init repo at /var/lib/docker/overlay2/xxx/diff: exec: "git": executable file not found in $PATH
ERROR: Job failed: exit code 1
1个回答

19

看起来问题是由于docker:dind中未安装git导致构建失败。

通过在单独的阶段中克隆Docker/BuildX,运行docker build,然后使用工件将其导出到部署阶段,解决了该问题。

buildx:
  image: docker:19.03-git
  stage: buildx
  variables:
    GIT_STRATEGY: none
  artifacts:
    paths:
      - buildx
    expire_in: 1 hour
  services:
    - docker:19.03-dind
  script:
    - export DOCKER_BUILDKIT=1
    - git clone git://github.com/docker/buildx ./docker-buildx
    - docker build --platform=local -o . ./docker-buildx

deploy:
  image: docker:19.03
  stage: deploy
  services:
    - name: docker:19.03-dind
      command: ["--experimental"]
  before_script:
    - mkdir -p ~/.docker/cli-plugins
    - mv buildx ~/.docker/cli-plugins/docker-buildx
    - docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
  script:
    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
    - docker buildx create --use --name mybuilder
    - docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 --push -t $CI_REGISTRY_IMAGE .

我决定更新我的答案,提供有关在CircleCI中使用BuildX的信息,因为GitLab对免费账户所做的更改以及由j0nl1Yajo发布的评论。

您可以通过以下方式下载BuildX二进制文件并在CircleCI作业中使用:

jobs:
  build-and-push:
    executor: docker/machine
    steps:
      - checkout
      - run:
          name: Remove old installation
          command: |
            sudo systemctl stop docker.service
            sudo apt remove docker-ce docker-ce-cli containerd.io
      - docker/install-docker:
          install-dir: /usr/bin
      - run:
          name: Restart docker daemon with experimental features
          command: |
            sudo bash -c 'echo "{\"experimental\":true}" > /etc/docker/daemon.json'
            if [[ $EUID == 0 ]]; then export SUDO=""; else export SUDO="sudo"; fi
            $SUDO systemctl unmask docker.service
            $SUDO systemctl unmask docker.socket
            $SUDO systemctl start docker.service
      - run:
          name: Install buildx
          command: |
            BUILDX_VERSION="v0.4.1"

            curl -sSLo docker-buildx "https://github.com/docker/buildx/releases/download/$BUILDX_VERSION/buildx-$BUILDX_VERSION.linux-amd64"
            chmod a+x docker-buildx
            mkdir -p ~/.docker/cli-plugins
            mv docker-buildx ~/.docker/cli-plugins/docker-buildx

            docker version
            docker buildx install
      - docker/check:
          registry: $DOCKER_REGISTRY
      - run:
          name: Create buildx profile
          command: |
            docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
            docker buildx create --use --name mybuilder
      - docker/build:
          registry: $DOCKER_REGISTRY
          image: username/repo
          tag: latest
          extra_build_args: --platform linux/amd64,linux/arm64,linux/arm/v7 --push

我正在尝试在Bitbucket中实现相同的目标,但问题是我无法运行dind,你找到了另一种构建多架构镜像的方法吗? - user9195230
@j0nl1 不,这是我能想到的唯一方法。根据您的情况,您可能可以在GitLab的新项目页面中使用“外部存储库的CI / CD”选项。它会为您从Git拉取项目以运行管道。 - Adeithe
1
我尝试了多种方法,但无法使用Bitbucket Pipeline,最终我选择了CircleCI。我找到了一个已经配置好的orb,使用起来非常顺利。 https://circleci.com/orbs/registry/orb/foodles/docker-buildx#jobs-publish - user9195230
4
你无需构建 buildx 插件,因为可以直接从 Github 下载。这样,你就可以跳过上面整个的 buildx 阶段:curl -sSLo ~/.docker/cli-plugins/buildx https://github.com/docker/buildx/releases/download/$BUILDX_VERSION/buildx-$BUILDX_VERSION.linux-amd64 && chmod +x ~/.docker/cli-plugins/buildx - Yajo
1
@Yajo 在你的脚本中使用 docker-buildx 代替 buildx。另外,由于编码问题,curl 无法正常工作。可以尝试使用以下命令:wget -O ~/.docker/cli-plugins/docker-buildx https://github.com/docker/buildx/releases/download/$BUILDX_VERSION/buildx-$BUILDX_VERSION.linux-amd64 && chmod +x ~/.docker/cli-plugins/docker-buildx - rpi_guru
@rpi_guru curl工作得非常好,文件名并不重要。我在答案中关于CircleCI的编辑按预期工作,并使用了与Yajo评论非常相似的方法。 - Adeithe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接