在 Amazon ECS 中更新服务的容器

Pet*_*epo 36 update containers amazon-web-services docker amazon-ecs

建议使用哪种方法来更新在 Amazon ECS 中运行的服务的容器?

AWS文档说:“如果你已经更新了应用程序的泊坞图像,你可以创建一个新的任务定义与图像,并将其部署到您的服务,一次一个任务。” 这几乎是当前文档中当前可用的所有内容(2015 年 4 月 13 日)。

我是否理解正确,在 Amazon ECS 中更新我的应用程序容器的唯一方法是创建一个新任务,然后停止旧任务并启动新任务?

我已经成功地在 Core OS 和 Fleectl 中使用了“最新”标签。这样做的好处是不需要为新的更新更改 Docker 镜像的标签,因为重新加载服务将看到新的更改并更新容器(使用相同的标签“最新”)。

您使用哪种方法在 Amazon ECS 中使用更新的 docker 镜像更新您的服务?

小智 20

不确定这是否被认为是废弃的问题 - 在解决我的问题时偶然发现了这个问题,现在添加我的解决方案,现在它已经解决了。

要使用新容器更新服务,您需要:

  1. 将新容器上传到存储库;
  2. 触发任务定义更新;
  3. 触发容器更新;
  4. 重要:确保服务规则允许启动新版本的任务。

如果服务任务没有更新到最新版本,请检查“事件”选项卡是否有错误。例如,可能 ECS 无法启动您的服务的新版本:您的集群中只有一个 ec2 实例,并且应用程序端口已在主机上使用。在这种情况下,将“min health/max health”限制设置为“0%, 100%”——这样,ECS 将选择在部署新容器之前杀死旧容器。这也会在几分钟内发生 - 如果您没有看到即时反馈,请不要着急。

下面是一个示例部署脚本,用于在预配置的集群和服务中更新容器。请注意,如果您的意思是“使用系列中的最新版本”,则无需指定版本。

awsRegion=us-east-1
containerName=..
containerRepository=..
taskDefinitionFile=...
taskDefinitionName=...
serviceName=...


echo 'build docker image...'
docker build -t $containerName .

echo 'upload docker image...'
docker tag $containerName:latest $containerRepository:$containerName
docker push $containerRepository:$containerName

echo 'update task definition...'
aws ecs register-task-definition --cli-input-json file://$taskDefinitionFile --region $awsRegion > /dev/null

echo 'update our service with that last task..'
aws ecs update-service --service $serviceName --task-definition $taskDefinitionName --region $awsRegion  > /dev/null
Run Code Online (Sandbox Code Playgroud)

  • 这迫使我在本地将任务定义为文件,如果我理解正确,那是我可以定义环境变量的唯一地方。有没有办法在没有本地环境变量的情况下做到这一点?理想情况下,我想发出一个命令来指向一个新的 docker 镜像标签,而不发送关于任务/服务/容器/等的任何其他信息。 (2认同)

小智 8

要更新您的应用程序,请更新任务定义,然后更新服务。请参阅http://docs.aws.amazon.com/AmazonECS/latest/developerguide/update-service.html