ECS / ECR:通常的做法是每个映像(及相关版本)有一个注册表吗?

aph*_*log 11 amazon-web-services amazon-ecs docker docker-registry

因此,我是ecs / ecr的新手,但似乎我必须在存储库名称后命名(带有标签)图像,以便将该图像推送到存储库。

所以我的问题是:是否打算让用户(我)仅将单个映像和该映像的任何关联版本推送到ecr中的单个存储库,从而在我需要推送完全不同的映像时创建另一个存储库?

基本上,一个用于nginx的仓库,一个用于postgressql的仓库,等等。

lxg*_*lxg 7

在我们的例子中,我们希望为所有服务建立一个存储库,否则我们将不得不为每一项服务创建和维护 ECR 基础设施。

\n

我们所做的基本上是为所有服务(在本例中为 Cloudformation)创建一个共享存储库:

\n
AWSTemplateFormatVersion: "2010-09-09"\n\nParameters:\n  registryName:\n    Type: String\n    Default: services\n\nResources:\n  ecr:\n    Type: AWS::ECR::Repository\n    Properties:\n      RepositoryName: !Ref registryName\n      ImageTagMutability: MUTABLE\n\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x80\xa6 然后在构建服务时,我们将使用SERVICENAME_VERSION作为实际图像/版本的约定:

\n
#!/bin/bash\n\nset -e\n\nexport AWS_ACCOUNT="123456789000"\nexport AWS_DEFAULT_REGION="eu-central-1"\nexport SERVICE_NAME="demo-service"\nexport SERVICE_VERSION="${SERVICE_VERSION:-latest}"\nexport IMAGE_NAME="$AWS_ACCOUNT.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/services:${SERVICE_NAME}_${SERVICE_VERSION}"\n\naws ecr get-login-password | docker login --username AWS --password-stdin "$AWS_ACCOUNT.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com"\ndocker build -t $IMAGE_NAME .\ndocker push $IMAGE_NAME\n\n
Run Code Online (Sandbox Code Playgroud)\n

(虽然很简单,但是有效。)

\n

更新:

\n

在实际示例中,当您想要将映像拉取到位于 VPC 中的 ECS 集群中时,您需要在 ECR 上设置 VPC 终端节点。Cloudformation 代码如下所示:

\n
  privateLinkEcrApi:\n    Type: AWS::EC2::VPCEndpoint\n    Properties:\n      ServiceName: !Sub "com.amazonaws.${AWS::Region}.ecr.api"\n      PrivateDnsEnabled: true\n      VpcId: !ImportValue vpc\n      SecurityGroupIds:\n        - !ImportValue albSecurityGroup\n      SubnetIds:\n        - !ImportValue publicSubnetA\n        - !ImportValue publicSubnetB\n      VpcEndpointType: Interface\n\n  privateLinkEcrDkr:\n    Type: AWS::EC2::VPCEndpoint\n    Properties:\n      ServiceName: !Sub "com.amazonaws.${AWS::Region}.ecr.dkr"\n      PrivateDnsEnabled: true\n      VpcId: !ImportValue vpc\n      SecurityGroupIds:\n        - !ImportValue albSecurityGroup\n      SubnetIds:\n        - !ImportValue publicSubnetA\n        - !ImportValue publicSubnetB\n      VpcEndpointType: Interface\n\n  privateLinkEcrLogs:\n    Type: AWS::EC2::VPCEndpoint\n    Properties:\n      ServiceName: !Sub "com.amazonaws.${AWS::Region}.logs"\n      PrivateDnsEnabled: true\n      VpcId: !ImportValue vpc\n      SecurityGroupIds:\n        - !ImportValue albSecurityGroup\n      SubnetIds:\n        - !ImportValue publicSubnetA\n        - !ImportValue publicSubnetB\n      VpcEndpointType: Interface\n\n  privateLinkEcrS3:\n    Type: AWS::EC2::VPCEndpoint\n    Properties:\n      ServiceName: !Sub "com.amazonaws.${AWS::Region}.s3"\n      VpcId: !ImportValue vpc\n      SecurityGroupIds:\n        - !ImportValue albSecurityGroup\n      SubnetIds:\n        - !ImportValue publicSubnetA\n        - !ImportValue publicSubnetB\n      VpcEndpointType: Interface\n\n  privateLinkEcrS3Gw:\n    Type: AWS::EC2::VPCEndpoint\n    Properties:\n      ServiceName: !Sub "com.amazonaws.${AWS::Region}.s3"\n      VpcId: !ImportValue vpc\n      RouteTableIds:\n        - !ImportValue publicRouteTable\n        - !ImportValue privateRouteTableA\n        - !ImportValue privateRouteTableB\n      VpcEndpointType: Gateway\n
Run Code Online (Sandbox Code Playgroud)\n

(注意:您必须调整此代码,因为实际的 VPC、子网等是在不同的模板中设置的,并且实际配置很大程度上取决于您自己的环境。但这应该会让您走上正轨。)

\n


MrD*_*Duk 6

是。而且,可能没有。

您将图像推送到ECR。如何配置映像取决于您。理想情况下,您将拥有一个单一责任的形象,但这是您的决定。

如果有多个图像,则推入多个ECR。如果您只有一张图像可以做很多事情,那么您就可以摆脱一个ECR。

您还可以通过创造性地使用标签将多个图像推送到同一ECR(例如,使用您自己的命名约定在标签中使用“图像名称或风味”)。

  • 必须为每个图像创建一个存储库有点奇怪。如果我有 100 个微服务,每个微服务都有自己的镜像,那么我最终会得到 100 个存储库吗? (20认同)
  • 您推送图像,而不推送容器 - 请参阅 https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-ecr-image.html (3认同)

Eth*_*hit 5

  1. 推荐推送同类型版本号的镜像。

例如 your-repo:1.1, your-repo:1.2

如果您推送的映像与 ECR 存储库中存在的映像相同,则旧映像将替换为您正在推送的新映像。

  1. 这取决于您的应用程序的工作方式。始终建议将容器在逻辑上分开工作。

例如具有持久卷的数据库映像。因此,如果数据库容器死亡,则不会影响您的数据。