Как правильно заставить мои задачи Amazon ECS обновлять свои образы Docker после обновления этих образов в соответствующем реестре?
docker
docker-registry
amazon-ecs
aknuds1
источник
источник
Ответы:
Если ваша задача выполняется в рамках службы, вы можете принудительно выполнить новое развертывание. Это приводит к повторной оценке определения задачи и извлечению нового образа контейнера.
источник
Каждый раз, когда вы запускаете задачу (либо через вызовы API
StartTask
и,RunTask
либо запускается автоматически как часть службы), агент ECS будет выполнять однуdocker pull
изimage
задач, указанных в определении задачи. Если вы используете одно и то же имя образа (включая тег) каждый раз, когда отправляете в реестр, вы сможете запустить новый образ, запустив новую задачу. Обратите внимание: если Docker не может получить доступ к реестру по какой-либо причине (например, проблемы с сетью или проблемы с аутентификацией), агент ECS попытается использовать кэшированный образ; Если вы хотите избежать использования кэшированных изображений при обновлении образа, вам нужно каждый раз вставлять в реестр другой тег и соответственно обновлять определение задачи перед запуском новой задачи.Обновление: теперь это поведение можно настроить с помощью
ECS_IMAGE_PULL_BEHAVIOR
переменной среды, заданной в агенте ECS. Подробности смотрите в документации . На момент написания поддерживаются следующие настройки:источник
/var/log/ecs
.AWS рекомендует зарегистрировать новое определение задачи и обновить сервис для использования нового определения задачи. Самый простой способ сделать это:
Это руководство содержит более подробную информацию и описывает, как вышеуказанные шаги вписываются в непрерывный процесс разработки продукта.
Полное раскрытие информации: в этом руководстве представлены контейнеры от Bitnami, и я работаю на Bitnami. Однако высказанные здесь мысли являются моими собственными, а не мнением Bitnami.
источник
Есть два способа сделать это.
Сначала используйте AWS CodeDeploy. Вы можете настроить сине-зеленые разделы развертывания в определении службы ECS. Сюда входят CodeDeployRoleForECS, еще одна TargetGroup для переключателя и тестовый прослушиватель (необязательно). AWS ECS создаст приложение и группу развертывания CodeDeploy и свяжет эти ресурсы CodeDeploy с вашим кластером / службой ECS и вашими ELB / TargetGroups. Затем вы можете использовать CodeDeploy для запуска развертывания, в котором вам нужно ввести AppSpec, который указывает, с помощью какой задачи / контейнера обновлять какую службу. Здесь вы указываете свою новую задачу / контейнер. Затем вы увидите, что новые экземпляры запускаются в новой TargetGroup, а старая TargetGroup отключена от ELB, и вскоре старые экземпляры, зарегистрированные в старой TargetGroup, будут прекращены.
Звучит очень сложно. Фактически, поскольку / если вы включили автоматическое масштабирование для своей службы ECS, простой способ сделать это - просто принудительно выполнить новое развертывание с помощью консоли или cli, как здесь указал джентльмен:
aws ecs update-service --cluster <cluster name> --service <service name> --force-new-deployment
Таким образом, вы по-прежнему можете использовать тип развертывания «скользящее обновление», и ECS просто запустит новые экземпляры и опустошит старые без простоя вашей службы, если все в порядке. Плохая сторона заключается в том, что вы теряете точный контроль над развертыванием и не можете вернуться к предыдущей версии, если произойдет ошибка, и это нарушит текущую службу. Но это действительно простой способ.
Кстати, не забудьте установить правильные числа для Минимального процента работоспособности и Максимального процента, например 100 и 200.
источник
Я создал сценарий для развертывания обновленных образов Docker в промежуточной службе на ECS, чтобы соответствующее определение задачи относилось к текущим версиям образов Docker. Я не знаю наверняка, следую ли я лучшим практикам, поэтому обратная связь будет приветствоваться.
Чтобы скрипт работал, вам нужен либо запасной экземпляр ECS, либо
deploymentConfiguration.minimumHealthyPercent
значение, чтобы ECS могла украсть экземпляр для развертывания обновленного определения задачи.Мой алгоритм такой:
Мой код вставлен ниже:
развертывание-ecs
_common.py
источник
AWS CodePipeline.
Вы можете установить ECR в качестве источника и ECS в качестве цели для развертывания.
источник
Попался в ту же проблему. Потратив часы, вы завершили эти упрощенные шаги для автоматического развертывания обновленного образа:
1. Изменения в определении задачи ECS: для лучшего понимания предположим, что вы создали определение задачи с приведенными ниже сведениями (примечание: эти числа будут меняться соответственно в соответствии с определением вашей задачи):
Затем вам необходимо внести следующие изменения:
2. Отметьте свое изображение как < your-image-name>: latest . Последний ключ отвечает за извлечение соответствующей задачей ECS.
3. нажать на изображение в ECR
4. применить силовое развертывание
Примечание. Я написал все команды, предполагая, что регион является us-east-1 . Просто замените его на свой регион при внедрении.
источник
Следующее сработало для меня, если тег изображения докера такой же:
источник
Используя AWS cli, я попробовал aws ecs update-service, как было предложено выше. Не забирал последний докер из ECR. В конце концов, я перезапускаю свой сценарий Ansible, в котором был создан кластер ECS. Версия определения задачи изменяется при запуске ecs_taskdefinition. Тогда все хорошо. Подбирается новый образ докера.
По правде говоря, не уверен, вызывает ли изменение версии задачи повторное развертывание или playbook, использующий ecs_service, вызывает перезагрузку задачи.
Если кому-то интересно, я получу разрешение на публикацию очищенной версии моей пьесы.
источник
ну, я также пытаюсь найти автоматический способ сделать это, то есть нажать изменения в ECR, а затем последний тег должен быть получен службой. Правильно, вы можете сделать это вручную, остановив задачу для своей службы из кластера. Новые задачи потянут обновленные контейнеры ECR.
источник
Следующие команды работали для меня
источник