当我在 CI 中构建映像时,我会使用唯一的 SHA 标签推送它。然后,当我将其部署到生产时,我想更改
:latest
别名以指向相同的图像,如下所示:
docker pull org/foo:34f8a342
docker tag org/foo:34f8a342 org/foo:latest
docker push org/foo:latest
现在我想避免拉动这个图像。问题是用于部署脚本的容器与用于构建它的容器不同,因此我本地没有此映像。有没有什么方法可以在 docker hub 上添加标签别名,而不需要在本地拥有此镜像?
docker manifest
命令:
docker manifest create $REPOSITORY:$TAG_NEW $REPOSITORY:$TAG_OLD
docker manifest push $REPOSITORY:$TAG_NEW
对于私有注册表,您可能需要将
$REGISTRY/
添加到存储库。
正如here所见,这是不允许的,但如果问题是拉动整个镜像很慢,正如有人在评论中提到的那样,那么只需通过Docker“拉动”清单如here就可以更快地实现注册表API
MANIFEST=$(curl -H "Accept: application/vnd.docker.distribution.manifest.v2+json" "${REGISTRY_NAME}/v2/${REPOSITORY}/manifests/${TAG_OLD}")
curl -X PUT -H "Content-Type: application/vnd.docker.distribution.manifest.v2+json" -d "${MANIFEST}" "${REGISTRY_NAME}/v2/${REPOSITORY}/manifests/${TAG_NEW}"
我不知道直接在 docker hub 上标记 docker 镜像。您的问题有一个解决方法,即在构建图像时用两个标签标记图像。
docker build
允许为一个构建创建多个标签:
docker build -t org/foo:34f8a342 -t org/foo:latest .
就我而言,我必须向现有的多拱形图像添加额外的标签。 Docker 标签不起作用,因为它只会拉取并标记与我的操作系统匹配的映像。
我不想再次使用
docker buildx imagetools create
,因为它会创建一个新的imageIndex。
我使用了Skopeo复制命令。
skopeo --multi-arch=index-only copy docker://<IMAGE>:<TAG> docker://<IMAGE>:<NEW TAG>