推送多个docker镜像以显示不带标签的

时间:2020-08-24 15:38:49

标签: docker continuous-integration containers docker-registry dockerhub

我有一个GitLab CI作业,该作业将同一应用程序的多种架构构建到Docker映像中。我想将它们推到DockerHub ,而无需标记每个图像。这样一来,我就可以将它们添加到清单中,而不用一堆重复的图像污染标签目录。

例如-来自这组标记:

  • r1234(包含以下内容的清单)
  • r1234-amd64
  • r1234-arm64
  • r1234-armv7
  • r1234-gui(包含以下内容的清单,每个图像均基于上面的图像)
  • r1234-amd64-gui
  • r1234-arm64-gui
  • r1234-armv7-gui

对此:

  • r1234(包含相同图像的清单,不带标签)
  • r1234-gui(类似)

这可能吗?我现在编写了这段代码来推送标签并生成清单,但是我不确定如何适应它。

- >
        for arch in $DEPLOY_ARCHS; do
          NEW_IMAGE_NAME="${REPO_PATH}:${REVISION}-${arch}${TAG_EXTRAS}"
          docker pull "${INDEV_IMAGE_NAME}-${arch}${TAG_EXTRAS}"
          docker tag "${INDEV_IMAGE_NAME}-${arch}${TAG_EXTRAS}" "${NEW_IMAGE_NAME}"
          docker push "${NEW_IMAGE_NAME}" # I want to be able to push to the manifest without tagging
          export IMAGES="$IMAGES ${NEW_IMAGE_NAME}"
        done
    - docker manifest create ${REPO_PATH}:${REVISION}${TAG_EXTRAS} ${IMAGES}
    - docker manifest push --purge ${REPO_PATH}:${REVISION}${TAG_EXTRAS}

这可能吗?

2 个答案:

答案 0 :(得分:1)

这是我找到的解决方案——尽管与 Jean 的 answer 相比,对于大多数人来说,这里添加的步骤和解决方法是不必要的。除非您特别需要我提供的内容,否则您应该采用该答案。

我想在不同的机器上运行构建——一个 arm box 和一个 and64 box——以实现比 qemu 可以提供的更好的构建速度。但是,GitLab / GitHub runner 之间无法相互通信,所以我无法使用 buildx 的能力在多台机器上本地运行。我想出的是构建映像,将它们推送到中间注册表(如果没有可用的注册表,则在本地导出和导入它们),拉取它们并将其用作另一个最终构建的缓存。

GitLab CI 中的类似内容:

# Build your images separately however you need, tagging with -${arch}

# Do testing on the image to make sure it validates, then...

deploy_image:
  stage: deploy
  script:
    - >
      for arch in "amd64 arm64 armv7"; do
        export name="$<YOUR CONTAINER URL AND TAG>-${arch}"
        docker pull "NAME" # or `docker load`
        export ARCH_IMAGES_CACHE="$ARCH_IMAGES_CACHE --cache-from $NAME"
      done
    # Docker will detect that the images we pulled are entirely cacheable, and use those without building
    - docker buildx build --push --pull $ARCH_IMAGES_CACHE --build-arg BUILDKIT_INLINE_CACHE=1 --platform="linux/amd64,linux/arm64,linux/arm/v7" -t "$<YOUR CONTAINER URL>:${CI_COMMIT_SHORT_SHA}" .

使用 docker manifestdocker buildx imagetools 可能有更好的方法或抽象,但这是我想出的最佳解决方案。

答案 1 :(得分:0)

您想要构建 multi-arch images 并且可以使用 buildx 来完成(假设它们在当前目录中共享相同的 dockerfile):

docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t yourorg/your-image-name:r1234 --push .

在 Gitlab-CI 上应该是这样的:

variables:
  DOCKER_HOST: tcp://docker:2375/
  DOCKER_DRIVER: overlay2

services:
  - docker:dind

build-multi-arch-images:
  stage: build-images
  image: jdrouet/docker-with-buildx:stable
  script:
   - docker buildx create --use
   - docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t yourorg/your-image-name:r1234 --push .

stages:
  - build-images

然后对于 r1234-gui,我建议在顶部使用此 trick 的第二个 dockerfile:

ARG MYAPP_IMAGE=yourorg/your-image-name:latest
FROM $MYAPP_IMAGE

这将允许您提供 MYAPP_IMAGE 作为命令行参数:

docker buildx build -f yourdockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t yourorg/your-image-name:r1234-gui --build-arg MYAPP_IMAGE=yourorg/your-image-name:r1234 --push .