如何将更新的 Docker 镜像部署到 Amazon ECS 任务?

6 浏览
0 Comments

如何将更新的 Docker 镜像部署到 Amazon ECS 任务?

一旦对应的注册表中的 Docker 镜像更新了,使我的 Amazon ECS 任务更新它们的 Docker 镜像的正确方法是什么?

0
0 Comments

问题的出现原因:需要将更新后的Docker镜像部署到Amazon ECS任务中。

解决方法:

1. 导航到任务定义。

2. 选择正确的任务。

3. 选择创建新版本。

4. 如果已经使用类似于:latest标签的方式拉取了最新版本的容器镜像,则直接点击创建。否则,更新容器镜像的版本号,然后点击创建。

5. 展开操作。

6. 选择更新服务(两次)。

7. 然后等待服务重新启动。

如果只有一个EC2实例,则需要更改服务的最小和最大值。将最小可用百分比设置为零,否则它将永远不会停止任务(使您的服务暂时下线),以便部署更新的容器。

对于没有服务的任务,此方法只适用于服务。对于没有服务的任务,在第4步之后,您需要停止当前任务并启动另一个任务,选择新的任务定义(选择正确的版本)。

实际上,我注意到如果Docker镜像已更新(使用相同的版本),您只需要停止任务并使用相同的任务定义启动新任务(如果不需要更改参数,则无需创建另一个任务定义)。

如果需要帮助解决这个问题,您应该描述您已经做了哪些工作以及遇到了什么错误。

请注意,此教程适用于Bitnami容器。

0
0 Comments

问题的出现原因:

每次启动任务时,ECS Agent都会执行docker pull指令,以获取任务定义中指定的镜像。如果每次推送到注册表时都使用相同的镜像名称(包括标签),则可以通过运行新任务来运行新镜像。但是,如果由于网络问题或身份验证问题等原因Docker无法访问注册表,ECS Agent将尝试使用缓存的镜像。为了在更新镜像时避免使用缓存的镜像,需要在每次推送到注册表之前将不同的标签推送到注册表,并相应地更新任务定义,然后运行新任务。

解决方法:

可以通过设置在ECS Agent上的ECS_IMAGE_PULL_BEHAVIOR环境变量来调整此行为。目前支持以下设置:

- 如果指定了"default",则远程拉取镜像。如果镜像拉取失败,则容器使用实例上的缓存镜像。

- 如果指定了"always",则始终远程拉取镜像。如果镜像拉取失败,则任务失败。此选项确保始终拉取镜像的最新版本。任何缓存的镜像都将被忽略,并且会受到自动化镜像清理过程的影响。

- 如果指定了"once",则仅在同一容器实例上的先前任务未拉取镜像或缓存镜像被自动化镜像清理过程删除时,才远程拉取镜像。否则,使用实例上的缓存镜像。这样可以确保不会尝试不必要的镜像拉取。

- 如果指定了"prefer-cached",则仅在没有缓存镜像时远程拉取镜像。否则,使用实例上的缓存镜像。为了确保不会删除缓存镜像,容器的自动化镜像清理被禁用。

值得注意的是,Fargate根本不会缓存镜像,它始终会从注册表中拉取镜像,因此不需要进行任何配置。

以上是关于如何将更新的Docker镜像部署到Amazon ECS任务的问题的原因和解决方法的整理。

0
0 Comments

当我们需要将更新的Docker镜像部署到Amazon ECS任务时,可以通过以下方法来实现。首先,如果任务正在运行服务下,我们可以强制进行新的部署。这将导致任务定义重新评估并拉取新的容器镜像。具体命令如下:

aws ecs update-service --cluster <集群名称> --service <服务名称> --force-new-deployment

然而,为了使这个方法生效,需要确保ECS实例上有足够的资源来部署同等大小的任务。AWS尝试在终止旧任务之前预先启动新任务实例,从而实现热交换。如果没有足够的资源,AWS会不断添加具有0个运行实例的“部署”条目。

为了避免在创建新部署时出现停机时间,可以采取以下两种方法之一:

1. 使用自动扩缩容功能,提前为新版本部署足够的实例。这样旧版本和新版本将同时运行。

2. 使用Fargate部署类型。设置服务的"最小健康百分比"参数为0,以允许ECS在部署新版本之前删除旧服务。但这样会导致一些停机时间。

另外,可能还需要添加`--region <区域>`参数来指定区域。

如果想要更新的只是Docker镜像而不是整个任务定义,需要等待旧容器被终止(或手动终止),才能看到新镜像带来的变化。否则,如果仍然有两个容器在运行,旧容器仍将处理流量。

如果想要替换旧容器为新容器,可以将"最小健康百分比"参数设置为0。

需要注意的是,这种方法只适用于覆盖镜像,而不适用于给镜像打新标签。

最近版本的awscli中,需要使用`--no-cli-pager`参数来防止命令提示用户输入。

关于是否可以通过AWS控制台来执行这个操作,以及关于在每天将代码推送到生产环境时如何进行更好的CI/CD部署的问题,可以参考相关链接进行进一步了解。

0