在使用aws 官方文档中指定的 codepipeline 部署 ECS 时,两个 docker 映像正在推入 ECR。一张图片同时包含提交 ID 和最新标签,而另一张图片未标记,如下图所示。
在"buildspec.yml"
我可以看到的文件中,docker正在推送两个图像,一个带有“最新标签”,另一个带有提交ID标签,如下所示
- docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
- COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
- IMAGE_TAG=${COMMIT_HASH:=latest}
- docker push $REPOSITORY_URI:latest
- docker push $REPOSITORY_URI:$IMAGE_TAG
我的问题是
1) 在 docker push 完成后,ECR 中必须有两个图像,一个带有"commit id"
标签,另一个带有“最新”标签。但是在 ECR 中,它显示的标签名称错误,请检查上面的附图。为什么一张图片显示为 untagged ?
2)当我的任务定义仅使用最新标签来构建容器时,为什么我需要推送两个带有提交 ID 和最新标签的图像。我不是必须只推送带有“最新”标签的 docker 镜像吗,为什么我需要推送带有 commit id 标签的镜像?
你确定这两条线来自同一条线
docker push
吗?我认为发生的事情是第二行是您的前一行:latest
,当您推送新行时:latest
,前一行变得未标记。检查 CodeBuild 脚本输出以验证您确实运行了两次推送,一次
:latest
使用:${COMMIT_HASH}
.tag
此外,我相信在推送到 ECR 之前,您必须在本地使用两个修订版的图像。但是我没有检查这个...这就是我们所做的(我们
${IMAGE_ID}
包含:${REVISION}
)...希望有帮助:)
这与 ECR 无关。这正是 docker 注册表的工作方式。
(1) 有问题的代码使用两个不同的标签推送同一张图片,因此您在同一张图片上同时看到
latest
和<commit-id>
标签是完全合理的。MLu 正确地建议您在 ECR 上已标记了一些图像latest
。当您将新图像推送到具有与新图像相同标签的旧图像的 docker 注册表时,旧图像会丢失此标签,如果没有其他标签,它将变为<untagged>
. 它与本地机器上的标记行为相同 (docker tag ...
)。(2) 如果您的任务定义仅使用
latest
标签,那么您不需要将两个标签都推送到 ECR。但是,在更复杂的场景中,您可能希望部署之前已经构建的映像(例如,最新构建有错误并且您想恢复),它可以节省构建时间。正如您在 (1) 中看到的,如果您推送带有标签的不同图像,如果您没有任何其他标签latest
,旧图像将变为旧图像。<untagged>
在这种情况下,您将不知道要部署哪个映像。提交 id 只是一种选择,例如,您可能希望使用日期或版本标记您的图像。