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