6

latest在 ECR 任务定义中使用标签时遇到问题,其中image参数的值类似于XXXXXXXXXXXX.dkr.ecr.us-east-1.amazonaws.com/reponame/web:latest.

latest一旦在容器实例(注册到集群的 EC2 实例)上运行新的服务实例(任务),我希望此任务定义能够从 ECR 中提取带有标签的图像。

但是,在我的情况下,当我远程连接到容器实例并列出 docker 映像时,我可以看到它没有从 ECR 中提取最新版本的映像。

最新标签在当前版本之后有两个发布版本,因为我更新了任务定义以使用latest明确定义版本标签的标签实例,即:v1.05.

我在这个集群上只有一个容器实例。

我的过程中可能存在一些怪癖,但这个问题主要是关于latest在这种情况下应该如何表现?

我的docker镜像构建和打标签、ECR推送、ECS任务定义更新、ECS服务更新流程:

# Build the image with multiple tags
docker build -t reponame/web:latest -t reponame/web:v1.05 .

# Tag the image with the ECR repo URI
docker tag ${imageId} XXXXXXXXXXXX.dkr.ecr.us-east-1.amazonaws.com/reponame/web

# Push both tags separately
docker push XXXXXXXXXXXX.dkr.ecr.us-east-1.amazonaws.com/reponame/web:v1.05
docker push XXXXXXXXXXXX.dkr.ecr.us-east-1.amazonaws.com/reponame/web:latest

# Run only if the definition file's contents has been updated
aws ecs register-task-definition --cli-input-json file://web-task-definition.json

# Update the service with force-new-deployment
aws ecs update-service \
  --cluster my-cluster-name \
  --service web \
  --task-definition web \
  --force-new-deployment

使用任务定义文件:

{
  "family": "web",
  "containerDefinitions": [
    {
      "name": "web",
      "image": "XXXXXXXXXXXX.dkr.ecr.us-east-1.amazonaws.com/reponame/web:latest",
      "essential": true,
      "memory": 768,
      "memoryReservation": 512,
      "cpu": 768,
      "portMappings": [
        {
          "containerPort": 5000,
          "hostPort": 80
        }
      ],
      "entryPoint": [
        "yarn", "start"
      ],
      "environment": [
        {
          "name": "HOST",
          "value": "0.0.0.0"
        },
        {
          "name": "NUXT_HOST",
          "value": "0.0.0.0"
        },
        {
          "name": "NUXT_PORT",
          "value": "5000"
        },
        {
          "name": "NODE_ENV",
          "value": "production"
        },
        {
          "name": "API_URL",
          "value": "/api"
        }
      ]
    }
  ]
}
4

2 回答 2

3

原来问题出在我的脚本上。正在使用一个不同的变量,该变量的旧值仍存储在我的终端会话中。

我已经验证,通过latest在任务定义的图像源 url 中使用标签确实有一个新启动的服务实例可以latest从 ECR 中提取带有标签的图像。

无需注册任务定义的新版本。

作为旁注,需要小心处理latest标签。在这种情况下,它似乎可以解决,但在许多其他情况下,它很容易出错:Ref1Ref2

于 2019-05-10T19:26:47.313 回答
0

构建新镜像时必须标注并推送latest,否则注册中心上不会更新标注。
还有一个选项可以在运行镜像时强制拉取,这样 docker 主机就不会因为latest昨天拉取而假设今天仍然应该尝试拉取latest

于 2020-07-16T10:28:36.493 回答