我目前正在试图设置一个简单的CI,以重新构建我的项目、创建一个新的docker镜像、将新镜像推送到amazon ecr仓库、使用最新的docker镜像创建现有任务定义的新版本、使用新版本的任务定义更新正在运行的服务,最后停止运行旧版本的现有任务并启动运行新版本的任务。
除了启动新版本任务外,一切都正常运作。
从bash脚本中,我调用的最终命令是:
aws ecs update-service --cluster "$CLUSTER" --service "$SERVICE" --task-definition "$TASK_DEFINITION":"$REVISION"
这导致了一个事件错误:
(service rj-api-service) was unable to place a task because no container instance met all of its requirements. The closest matching (container-instance bbbc23d5-1a09-45e7-b344-e68cc408e683) is already using a port required by your task.
这是有道理的,因为我要替换的容器与新容器完全相同且将在相同端口运行,只不过它包含了我的应用的最新版本。
我一直以为update-service
命令会停止现有任务并启动新任务,但似乎它会先启动新任务,如果成功则停止旧任务。
处理这种情况的最佳实践是什么? 我应该先停止旧任务吗? 还是应该在脚本中首先删除服务并重新创建整个服务每次更新?
目前我只需要运行1个任务实例,但如果我需要自动扩展到多个实例,我不想让自己陷入困境。 有关如何解决此问题的最佳建议吗?