将Docker映像推送到Amazon ECS存储库


78

我是AWS的新手。我想在AWS ECS容器实例上设置私有Docker存储库。我创建了一个名为的存储库name。AWS显示的示例推入命令正在运行。

aws ecr get-login --region us-west-2 
docker build -t name .
docker tag name:latest ############.dkr.ecr.us-west-2.amazonaws.com/name:latest 
docker push ############.dkr.ecr.us-west-2.amazonaws.com/name:latest

但是,通过此命令,我构建并推送了一个名为的映像name,我想构建一个名为的映像foo。所以我将命令更改为:

docker build -t foo .
docker tag foo ###########.dkr.ecr.us-west-2.amazonaws.com/name/foo
docker push ###########.dkr.ecr.us-west-2.amazonaws.com/name/foo

这应该可以,但是不能。经过一段时间的重试后,我得到了错误:

The push refers to a repository [###########.dkr.ecr.us-west-2.amazonaws.com/name/foo]
8cc63cf4528f: Retrying in 1 second
...
name unknown: The repository with name 'name/foo' does not exist in the registry with id '############'

AWS真的需要我要推送的每个映像专用的存储库吗?

Answers:


81

EC2容器注册需要一个像仓库要设置为你想要发布到注册表中的每个图像“名”或“命名空间/名称”。

不过,您可以:tags在每个存储库中发布任何您想要的内容(默认限制是100个标签)。

我没有在AWS文档中的任何地方看到具体说明存储库->映像名称映射的信息,但这是通过创建存储库-ECR用户指南中的6d部分暗示的

码头工人形象规范包括它的定义中的

资料库

标签的集合,这些标签被分组在一个通用前缀(之前的名称组件:)下。例如,在标记有名称的图像中 my-app:3.1.4,my-app是名称的存储库组件。存储库名称由斜杠分隔的名称组成,可以选择以DNS主机名作为前缀。主机名必须符合标准DNS规则,但不能包含_字符。如果存在主机名,则可以选择在其后跟格式的端口号 :8080。名称组件可能包含小写字符,数字和分隔符。分隔符定义为一个句点,一个或两个下划线或一个或多个破折号。名称组件不能以分隔符开头或结尾。


6
是否有任何文档明确说明每个注册表一个映像?
HHC

抱歉,我的意思是每个存储库一个图像名称。
HHC

4
啊..我不认为AWS明确声明其ECR存储库概念与单个Docker映像namenamespace/name。这是我第一次尝试了几次。docs.aws.amazon.com/AmazonECR/latest/userguide / ...上的6d部分暗示了一个名称/多个标签存储库设置,其图像构建标签为repository:latest
Matt

6
@Matt我希望他们(aws)能将其确定下来并使其成为一个困难的事实。我不喜欢他们的文档写得松散的解释。
Kuberchaun

1
取代是Docker市场营销希望您认可的一个重要术语。集线器不会走到任何地方,甚至可以成为“免费”商店映像的来源。
马特

46

您需要为每个映像名称创建一个存储库,但是映像名称可以采用“ mycompanyname / helloworld”的形式。所以你创建mycompanyname/app1mycompanyname/app2等等

aws ecr create-repository --repository-name mycompanyname/helloworld
aws ecr create-repository --repository-name mycompanyname/app1
aws ecr create-repository --repository-name mycompanyname/app2
docker tag helloworld:latest xxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/mycompanyname/helloworld:latest
docker push xxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/mycompanyname/helloworld:latest
docker tag app1:latest xxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/mycompanyname/app1:latest
docker push xxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/mycompanyname/app1:latest

1
确实有效,顺便说一句,ACR不需要先手动创建代表。
Tilo

同样,如果不同的“ sub rep”,似乎也需要推送图像
Tilo

1

我尝试了以下步骤并确认为我工作:

  1. | aws ecr get-login-password --region us-west-2 | docker login-用户名AWS --password-stdin xxxxxxxx.dkr.ecr.us-west-2.amazonaws.com

  2. aws ecr create-repository --repository-name测试

  3. docker build -t测试

  4. 泊坞窗标签test:latest xxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/test:latest

  5. 码头工人推xxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/test:latest


0

除了上面的答案,我今天在这里遇到过,因为登录命令更改为aws-cli v2,发布为答案可能会对其他人有所帮助。作为aws-cli v1登录命令不再起作用。

V1
$(aws ecr get-login --no-include-email)

要使用aws-cli v2将图像推送到ECR,您需要

aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 123456789.dkr.ecr.us-west-2.amazonaws.com

那你就可以建造并推动

docker build -t myrepo .
docker tag myrepo:latest 123456789.dkr.ecr.us-west-2.amazonaws.com/myrepo
docker push 123456789.dkr.ecr.us-west-2.amazonaws.com/myrepot

通常,每个注册表一个映像是一种干净的方法,这就是为什么AWS将每个存储库和每个区域的存储库的映像从1000个增加到10,000个的原因。


-5

无需为每个映像创建存储库,只需重新命名即可:

docker build -t foo .
docker tag foo ####.dkr.ecr.us-west-2.amazonaws.com/name:foo_v0.23.1
docker push ####.dkr.ecr.us-west-2.amazonaws.com/name:foo_v0.23.1

是的,但是使用标签来区分您的图像是糟糕的工作方式。
dwjohnston

糟糕的解决方案,标签就是我们对图像进行版本控制的方式
Ernani

正如以上评论所暗示的,这是一种反模式。如果在大型开发团队中使用,那很容易证明容易出错。您最好编写解决方案的脚本。像这样的东西:gist.github.com/jmervine/b1835fa3bfcea9eaa9bf2521291f0615
jmervine '18

3
@jmervine“更好”,而不是“更好”。
Acumenus

在某些情况下,这似乎是完全合理的。例如,许多流行的docker存储库都使用这种方法来区分图像的“风味”,例如nginx:alpinevsnginx:perl
jchook
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.