我通过consul的键值存储将应用程序配置提供给在ECS服务中运行的应用程序容器。
应用程序在启动时仅从consul读取其配置一次。
当我需要更改配置时,我应该如何重新启动容器以便刷新应用程序配置?
我希望通过aws cli以编程方式执行此操作。
答案 0 :(得分:9)
您不会重新启动容器。但是,您可以停止各个任务,ECS将在群集的某个位置重新生成您的任务的另一个实例。
答案 1 :(得分:2)
我遇到了同样的挑战,我所做的是遵循 this 指南(根据您的服务使用旧的或新的控制台)。我不知道这是否可以通过 CLI 完成,但它实际上“重新启动服务”,因为它为您的服务重新生成新任务并杀死旧任务。
总结(在旧控制台中):
答案 2 :(得分:1)
这对我有用:
aws ecs list-tasks --cluster my-cluster-name | jq -r ".taskArns[]" | awk '{print "aws ecs stop-task --cluster my-cluster-name --task \""$0"\""}' | sh
答案 3 :(得分:0)
关于这个问题的两个现有解决方案都不令人满意。我还没有完整的答案(还),但我可以 A)告诉你我发现了什么,B)告诉你什么是处理这个问题的“正确”架构。
我的印象是通过 SSH 连接到实例然后只需 docker restart <container-id>
应该可以工作。
事实上,最初似乎是这样。但是,结果我错了,它只是一罐蠕虫在等着我!这样做会导致容器开始时没有 IAM 角色/凭证来与其他 AWS 服务通信。我的故事详细发生在 ecs-agent
的 this Github issue。我花了 10 多个小时才发现这是罪魁祸首。显然,容器只有在如果 ecs-agent 启动它们,而不是你启动/重新启动它们,才会处于适当的状态。
我相信 ECS/Tasks 背后的心态和哲学是他们想要完全控制您和容器运行环境之间的抽象层。您只需说“嘿,我想要运行这些 user-avatar-uploader-to-s3 容器中的 3 个”,它就会为您完成这项工作。但是你不欢迎你干涉他们做生意的方式!
但是,如果您希望容器可配置并向其传递某些参数(例如原始问题中的 consul 键值对),您可以将它们定义为 环境变量在任务定义(对于每个容器)和服务/任务执行中。
因此,正确的方法是重做容器代码以将这些参数(键值对)作为环境变量(或来自可配置的安全私有 S3 存储桶或 AWS SecretsManager)。然后将所需的值放入任务/任务执行中,瞧它应该可以工作了。然后您可以随时更改它们,ECS 会处理它。 (请注意,这将是一个新容器/任务,使用新设置启动,而不是更新旧的。)
就是这样。
(我会在找到如何进行紧急心脏直视手术 docker 重启后立即更新此答案。)