0

我有一个私有 AWS ECR 存储库,我在其中推送图像。

我正在运行以下命令来推送图像,

1. docker build -t $REPOSITORY_URL:develop -f ./docker/root/dockerfile .
2. docker push $REPOSITORY_URL:develop

这很有效,我可以在我的存储库中看到一个具有正确图像 URI 和开发标记的新图像。

但是,当我尝试通过使用添加具有不同标签的新图像时

1. docker build -t $REPOSITORY_URL:release -f ./docker/root/dockerfile .
2. docker push $REPOSITORY_URL:release

在我的 ECR 存储库中,我没有看到新图像,但我看到带有两个标签的原始图像。原来的开发标签和现在的发布标签。

我希望,因为我将$REPOSITORY_URL:release标签定义为发布,所以当我运行docker push $REPOSITORY_URL:release它时,它将使用新标签推送我的新图像,并且我将能够在我的 ECR 存储库中看到两个图像。

目前,出于测试目的,图像是相同的。我认为这是导致此问题的原因。如果我使用不同的图像运行上述命令,它会按预期工作。

有没有办法防止这种情况发生?例如,在生产中,如果我必须让相同的图像使用不同的标签,它们是否能够按预期推送和工作?

4

1 回答 1

2

如果图像相同并且您只是使用不同的标签推送,那么 ECR 将检查清单是否将其显示在相同的标签下。

在此处输入图像描述 简而言之,如果图像摘要相同,ECR 将认为它与不同的标签相同。

在此处输入图像描述

因此,由于您的图像相同,我建议使用重新标记图像。

重新标记图像

使用 Docker Image Manifest V2 Schema 2 映像,您可以使用 put-image 命令的 --image-tag 选项重新标记现有映像。您可以在不使用 Docker 拉取或推送图像的情况下重新标记。对于较大的图像,此过程可以节省大量网络带宽和重新标记图像所需的时间。

此外,ECR 还有一个有趣的功能。

图像标签可变性

您可以将存储库配置为不可变,以防止图像标签被覆盖。为不可变标签配置存储库后,如果您尝试使用存储库中已存在的标签推送图像,将返回ImageTagAlreadyExistsException 错误。

图像标签可变性

于 2019-11-12T18:40:51.603 回答