当管道 运行 使用 CDK 管道模块时,如何使 Fargate 服务从 ECR 存储库部署最新图像?
How to make a Fargate Service deploy the latest image from an ECR repository when a pipeline is run using CDK pipelines module?
我已经使用 CDK Pipelines 模块设置了 AWS CodePipeline 堆栈。当代码被推送到支持 CodeCommit 存储库时,管道开始执行并执行以下操作:
- 拉取最新源
- 综合堆栈
- 更新管道(自变异)
- 构建docker图像
- 将 docker 图像推送到 ECR 存储库(带有 'latest' 标签)
- 创建 Fargate 任务定义和容器(使用带有 'latest' 标签的 ECR 图像)
- 创建 Fargate 服务
- 将 Fargate 服务添加到 ALB 的目标组
一切正常。
但每次我推送到存储库时,我都希望 Fargate 服务使用最新的 docker 图像进行更新。这没有发生。 Fargate 服务未更新,服务中的任务继续 运行 使用创建 Fargate 服务时最新的 docker 图像。
如何更新 Fargate 服务,即使用最新映像启动新任务并使用旧映像关闭现有任务?
如果我 运行 从命令行手动执行以下命令,则服务会更新,即使用最新映像启动新任务并使用旧映像关闭现有任务。
aws ecs update-service --cluster CLUSTER_NAME --service SERVICE_NAME --force-new-deployment
您将执行与手动执行相同的操作,但在管道中。添加部署后执行命令的 CodeBuildStep。
或者,您可以使用资产并让管道处理构建和 ECR 上传。
对于 ECS,您将使用 ContainerImage.fromDockerImageAsset()
。
这将使用新标签更新任务定义,这将强制重新部署。
要了解正在发生的事情,您必须了解这些任务是如何工作的。基本上,当您注册一个任务时,它将在 S3 中创建。因此,当您在 ECS 中启动此任务时,它会向 S3 询问任务详细信息。
如果您没有发布任务的新版本,它会尝试通过图像标签而不是图像标签来拉取您的图像(每个图像都不同,即使标签相同)。
因此,即使您推送了一张新图片,它仍然在推送一张旧图片。
要解决此问题,您只需在推送图像后发布新版本的任务即可。
我不知道你的 CI/CD 是如何工作的,但你可以使用 API 来做到这一点:
https://docs.aws.amazon.com/cli/latest/reference/ecs/update-task-set.html
我有一个类似的问题,我通过获取任务定义、删除版本,然后使用更新任务集推送它来解决它。它正在发布新版本的任务定义,其中包含新图像的 ID。
我已经使用 CDK Pipelines 模块设置了 AWS CodePipeline 堆栈。当代码被推送到支持 CodeCommit 存储库时,管道开始执行并执行以下操作:
- 拉取最新源
- 综合堆栈
- 更新管道(自变异)
- 构建docker图像
- 将 docker 图像推送到 ECR 存储库(带有 'latest' 标签)
- 创建 Fargate 任务定义和容器(使用带有 'latest' 标签的 ECR 图像)
- 创建 Fargate 服务
- 将 Fargate 服务添加到 ALB 的目标组
一切正常。
但每次我推送到存储库时,我都希望 Fargate 服务使用最新的 docker 图像进行更新。这没有发生。 Fargate 服务未更新,服务中的任务继续 运行 使用创建 Fargate 服务时最新的 docker 图像。
如何更新 Fargate 服务,即使用最新映像启动新任务并使用旧映像关闭现有任务?
如果我 运行 从命令行手动执行以下命令,则服务会更新,即使用最新映像启动新任务并使用旧映像关闭现有任务。
aws ecs update-service --cluster CLUSTER_NAME --service SERVICE_NAME --force-new-deployment
您将执行与手动执行相同的操作,但在管道中。添加部署后执行命令的 CodeBuildStep。
或者,您可以使用资产并让管道处理构建和 ECR 上传。
对于 ECS,您将使用 ContainerImage.fromDockerImageAsset()
。
这将使用新标签更新任务定义,这将强制重新部署。
要了解正在发生的事情,您必须了解这些任务是如何工作的。基本上,当您注册一个任务时,它将在 S3 中创建。因此,当您在 ECS 中启动此任务时,它会向 S3 询问任务详细信息。 如果您没有发布任务的新版本,它会尝试通过图像标签而不是图像标签来拉取您的图像(每个图像都不同,即使标签相同)。
因此,即使您推送了一张新图片,它仍然在推送一张旧图片。 要解决此问题,您只需在推送图像后发布新版本的任务即可。
我不知道你的 CI/CD 是如何工作的,但你可以使用 API 来做到这一点: https://docs.aws.amazon.com/cli/latest/reference/ecs/update-task-set.html
我有一个类似的问题,我通过获取任务定义、删除版本,然后使用更新任务集推送它来解决它。它正在发布新版本的任务定义,其中包含新图像的 ID。