推送多个 docker 个图像以在没有标签的情况下显示
Push multiple docker images to manifest without tags
我有一个 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}
这可能吗?
您想构建 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,我会建议在顶部使用这个 的第二个 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 .
这是我找到的解决方案——虽然对于大多数人来说,与 Jean 的 相比,此处添加的步骤和解决方法是不必要的。除非您特别需要我提供的内容,否则您应该选择该答案。
我想 运行 在不同的机器上构建——一个 arm box 和一个 amd64 box——以获得比 qemu 提供的更快的构建速度。但是,GitLab / GitHub 运行ners 不能相互通信,所以我无法使用 buildx 的能力在多台机器上 运行 本机。我想出的是构建图像,将它们推送到中间注册表(或者如果没有可用的注册表,则在本地导出和导入它们),拉取并将它们用作另一个最终 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 manifest
或 docker buildx imagetools
完成,但这是我想出的最佳解决方案。
我有一个 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}
这可能吗?
您想构建 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,我会建议在顶部使用这个
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 .
这是我找到的解决方案——虽然对于大多数人来说,与 Jean 的
我想 运行 在不同的机器上构建——一个 arm box 和一个 amd64 box——以获得比 qemu 提供的更快的构建速度。但是,GitLab / GitHub 运行ners 不能相互通信,所以我无法使用 buildx 的能力在多台机器上 运行 本机。我想出的是构建图像,将它们推送到中间注册表(或者如果没有可用的注册表,则在本地导出和导入它们),拉取并将它们用作另一个最终 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 manifest
或 docker buildx imagetools
完成,但这是我想出的最佳解决方案。