В настоящее время я пытаюсь создать простой CI, который перестроит мой проект, создаст новое изображение докеров, подтолкнет новое изображение к репозиторию amazon ecr, создаст новую ревизию существующего определения задачи с последним изображением докеров, обновить запущенную службу с новой ревизией определения задачи и, наконец, остановить существующую задачу, выполняющую старую ревизию, и запустить запуск новой версии.
Все работает отлично, за исключением начала новой ревизии задачи.
От bash script заключительная команда, которую я вызываю:
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
остановит существующую задачу и запустит новую, но похоже, что она сначала запускает новую, и если она преуспевает, она останавливает старую.
Какова наилучшая практика для этого? Должен ли я сначала остановить старую задачу? Должен ли я просто удалить службу в моем script и обновить всю услугу каждое обновление?
В настоящее время мне нужен только один экземпляр запускаемой задачи, но я не хочу вставлять себя, если мне это нужно, чтобы иметь возможность автоматического масштабирования для нескольких экземпляров. Любые предложения по наилучшему способу решения этой проблемы?