首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GitLab CI/CD:建立多学科码头图像

GitLab CI/CD:建立多学科码头图像
EN

Stack Overflow用户
提问于 2020-04-25 17:46:51
回答 2查看 4.8K关注 0票数 5

我想要一种简单的方法,在一个GitLab运行程序中构建多层码头形象。简单地说,我的意思是我只需要在我的项目中添加一个..gitlab ci.yml,它就能工作了。

这是我写的..gitlab ci.yml。它使用buildx构建一个多弓映像,然后将其推送到GitLab注册中心:

代码语言:javascript
复制
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 64平台不可用。

下面是我如何构建cl00e9ment/buildx映像(来自snadn/码头-buildx的强烈启发):

以下是Dockerfile:

代码语言:javascript
复制
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

...add这里是用于构建和推送cl00e9ment/buildx映像的..gitlab ci.yml文件:

代码语言:javascript
复制
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。一切都很好。
  • 在此之后,我再次运行它(就在构建之后和推送之前),它仍然给出了linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
  • 然而,在测试阶段,当映像在干净的环境中从Docker下载时,它会给出linux/amd64, linux/386

为什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-24 06:24:52

不幸的是,在GitLab CI上构建多弓图像有很多过时和错误的信息。这似乎变化相当频繁,因为它仍然是一个实验性的特点。但是,在撰写这篇文章时,我是如何在GitLab公共运行程序(armv6、armv6、arm64、amd64)上构建多层架构的:

首先,必须构建并推送包含buildx二进制文件的Docker映像。下面是我为此使用的Dockerfile:

代码语言:javascript
复制
FROM docker:latest
ARG BUILDX_VER=0.4.2
RUN mkdir -p /root/.docker/cli-plugins && \
    wget -qO ~/.docker/cli-plugins/docker-buildx \
    https://github.com/docker/buildx/releases/download/v${BUILDX_VER}/buildx-v${BUILDX_VER}.linux-amd64 && \
    chmod +x /root/.docker/cli-plugins/docker-buildx

尽管运行了初始化代码: GitLab,但当前的binfmt运行程序映像没有正确初始化binfmt处理程序。

所以我们必须在准备中做到这一点。我们参考了先生1861中关于GitLab运行程序代码的注释,并在.gitlab-ci.yml中添加了以下魔术酱

代码语言:javascript
复制
before_script:
  - docker run --rm --privileged multiarch/qemu-user-static --reset -p yes 

然后,我们可以使用docker logindocker buildx build --usedocker buildx build --push ...等运行管道脚本的其余部分。

现在,运行程序已经准备好为多个体系结构构建。我的最后一个.gitlab-ci.yml可以在这里看到:https://github.com/oofnikj/nuttssh/blob/multiarch/.gitlab-ci.yml

票数 8
EN

Stack Overflow用户

发布于 2020-07-06 03:53:08

好的,我想我知道这里发生了什么:您需要在某个地方调用update-binfmts --enable来启用binfmt_misc提供的额外格式。

我能够在gitlab上(经过大量搜索)使用这个回购和它的停靠映像:https://gitlab.com/ericvh/docker-buildx-qemu获得多弓映像。

然而,该回购有自己的依赖于自己的码头映像存储库,以建立自己的多重版本,并依赖于一个gitlab模板回购为其ci。我不太相信这个依赖网络是如何开始的,回购的主人比我更熟练,但对于我的使用,我已经分叉了回购,我现在试图修改它的CI,以减少对外部来源的依赖。

编辑:对于来自未来的人,这是Dockerfile:

代码语言:javascript
复制
FROM debian
# Install Docker and qemu
# TODO Use docker stable once it properly supports buildx
RUN apt-get update && apt-get install -y \
        apt-transport-https \
        ca-certificates \
        curl \
        gnupg2 \
        software-properties-common && \
    curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - && \
    add-apt-repository "deb https://download.docker.com/linux/debian $(lsb_release -cs) stable" && \
    apt-get update && apt-get install -y \
        docker-ce-cli \
        binfmt-support \
        qemu-user-static

# Install buildx plugin
RUN mkdir -p ~/.docker/cli-plugins && \
    ARCH=`dpkg --print-architecture` && echo Running on $ARCH && curl -s https://api.github.com/repos/docker/buildx/releases/latest | \
        grep "browser_download_url.*linux-$ARCH" | cut -d : -f 2,3 | tr -d \" | \
    xargs curl -L -o ~/.docker/cli-plugins/docker-buildx && \
    chmod a+x ~/.docker/cli-plugins/docker-buildx

# Write version file
RUN printf "$(docker --version | perl -pe 's/^.*\s(\d+\.\d+\.\d+.*),.*$/$1/')_$(docker buildx version | perl -pe 's/^.*v?(\d+\.\d+\.\d+).*$/$1/')" > /version && \
    cat /version

和一个精简版本的..gitlab ci.yml

代码语言:javascript
复制
build:
  image: docker:dind
  stage: build
  services:
    - name: docker:dind
      entrypoint: ["env", "-u", "DOCKER_HOST"]
      command: ["dockerd-entrypoint.sh"]
  variables:
    DOCKER_HOST: tcp://docker:2375/
    DOCKER_DRIVER: overlay2
    # See https://github.com/docker-library/docker/pull/166
    DOCKER_TLS_CERTDIR: ""
  before_script:
    - |
      if [[ -z "$CI_COMMIT_TAG" ]]; then
        export CI_APPLICATION_REPOSITORY=${CI_APPLICATION_REPOSITORY:-$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG}
        export CI_APPLICATION_TAG=${CI_APPLICATION_TAG:-$CI_COMMIT_SHA}
      else
        export CI_APPLICATION_REPOSITORY=${CI_APPLICATION_REPOSITORY:-$CI_REGISTRY_IMAGE}
        export CI_APPLICATION_TAG=${CI_APPLICATION_TAG:-$CI_COMMIT_TAG}
      fi
    - echo "$CI_REGISTRY_PASSWORD" | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY
  script:
    - docker build -t "$CI_APPLICATION_REPOSITORY:$CI_APPLICATION_TAG" -t "$CI_APPLICATION_REPOSITORY:latest" .
    - docker push "$CI_APPLICATION_REPOSITORY:$CI_APPLICATION_TAG"  
    - docker push "$CI_APPLICATION_REPOSITORY:latest"

编辑:

此外,我发现这个使用上面构建的映像的gitlabci配置可以使用构建缓存:

代码语言:javascript
复制
stages:
  - build

variables:
  CI_BUILD_ARCHS: "linux/amd64,linux/arm/v6,linux/arm/v7"
  CI_BUILD_IMAGE: "registry.gitlab.com/gdunstone/docker-buildx-qemu"

build_master:
  image: $CI_BUILD_IMAGE
  stage: build
  services:
    - name: docker:dind
      entrypoint: ["env", "-u", "DOCKER_HOST"]
      command: ["dockerd-entrypoint.sh"]
  variables:
    DOCKER_HOST: tcp://docker:2375/
    DOCKER_DRIVER: overlay2
    # See https://github.com/docker-library/docker/pull/166
    DOCKER_TLS_CERTDIR: ""
  retry: 2
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  # Use docker-container driver to allow useful features (push/multi-platform)
    - update-binfmts --enable # Important: Ensures execution of other binary formats is enabled in the kernel
    - docker buildx create --driver docker-container --use
    - docker buildx inspect --bootstrap
  script:
    - >
        docker buildx build --platform $CI_BUILD_ARCHS 
        --cache-from=type=registry,ref=$CI_REGISTRY_IMAGE/cache:latest
        --cache-to=type=registry,ref=$CI_REGISTRY_IMAGE/cache:latest
        --progress plain 
        --pull --push 
        --build-arg CI_PROJECT_PATH=$CI_PROJECT_PATH
        -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA" 
        -t "$CI_REGISTRY_IMAGE:latest" .
  only:
    - master
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61430005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档