"latest" 标签在 ECS 任务定义和从 ECR 中提取的容器实例中如何工作?

How does "latest" tag work in an ECS task definition and container instances pulling from ECR?

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

一旦新服务实例(任务)在容器实例(注册到集群)。

但是在我的例子中,当我远程连接到容器实例并列出 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"
        }
      ]
    }
  ]
}

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

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

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

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

构建新镜像时必须标签并推送latest,否则标签不会在注册表中更新。
当 运行 图像时还有一个强制拉取的选项,这样 docker 主机就不会假设仅仅因为它昨天拉取了 latest,它仍然应该尝试拉取 [=10] =]今天