Как развернуть обновленные образы Docker в задачах Amazon ECS?

Как сказал однажды, как правильно заставить мои задачи Amazon ECS обновлять свои образы Docker образы обновлялись в соответствующем реестре?


person aknuds1    schedule 17.01.2016    source источник
comment
Я бы порекомендовал запустить автоматическую / запланированную функцию лямбда. Таким образом, это вне экземпляра. Вы пробовали это? Вы также можете использовать SWF для выполнения действий за раз   -  person iSkore    schedule 17.01.2016
comment
Мне не нужно автоматизировать @iSkore. В конце концов, я хотел бы написать для него сценарий, но выбираю сам, когда его запускать.   -  person aknuds1    schedule 17.01.2016
comment
Ааааааааааааааааааааааааааааа. Не был в этом уверен. Не могли бы вы предоставить немного дополнительной информации?   -  person iSkore    schedule 17.01.2016
comment
@iSkore Я не знаю, как описать это лучше, чем я уже описал. Процедура: 1. Загрузите новую версию образа Docker в реестр. 2. Разверните новую версию образа в ECS. Вопрос в том, как реализовать последнее.   -  person aknuds1    schedule 17.01.2016
comment
это тоже непросто или очевидно с EKS .. как F является наиболее частой задачей использования кластера, развертывания нового образа, столь непонятного в документации?   -  person    schedule 02.08.2019
comment
посмотри на мой простой сценарий   -  person Jwf    schedule 10.09.2020


Ответы (12)


Если ваша задача выполняется в рамках службы, вы можете принудительно выполнить новое развертывание. Это приводит к повторной оценке определения задачи и извлечению нового образа контейнера.

aws ecs update-service --cluster <cluster name> --service <service name> --force-new-deployment
person Dima    schedule 01.02.2018
comment
Я думаю, чтобы это сработало, вам нужно убедиться, что на ваших экземплярах ECS достаточно ресурсов для развертывания дополнительной задачи того же размера. Я предполагаю, что AWS пытается по существу выполнить горячую замену, ожидая предварительной загрузки нового экземпляра задачи, прежде чем завершить работу старого. Он просто продолжает добавлять записи о развертывании с 0 запущенными экземплярами, если вы этого не сделаете. - person Alex Fedulov; 06.02.2018
comment
@AlexFedulov, да, я думаю, вы правы. Чтобы избежать простоев при создании нового развертывания, вы можете: 1) Предоставить достаточно экземпляров для развертывания новой версии вместе со старой. Этого можно добиться с помощью автомасштабирования. 2) Используйте тип развертывания Fargate. Вы можете избежать выделения дополнительных ресурсов, установив для параметра минимального процента работоспособности службы значение 0, чтобы позволить ECS удалить вашу старую службу перед развертыванием новой. Однако это повлечет за собой некоторое время простоя. - person Dima; 08.02.2018
comment
Неизвестные параметры: --force-new-deployment - person user4674453; 24.09.2018
comment
Неизвестные параметры: --force-new-deployment: upgrade awscli - person Kyle Parisi; 20.12.2018
comment
Спасибо, @KyleParisi! Я хотел на это ответить, но не совсем понимал, как ... :) - person Dima; 21.12.2018
comment
Вам также может потребоваться добавить флаг --region <region> - person shwz; 11.01.2019
comment
Искал половину интернета, это все, что мне действительно нужно, просто обновление до последнего образа докера, ничего больше. Кстати, если кому-то интересно, run-task работает аналогично, вы можете переопределить даже команду определения задачи, не создавая новую задачу - person holms; 05.02.2019
comment
спасибо, как насчет проверки того, что задача работает нормально какие-либо команды? - person Rai Talha Rehman Khan; 20.07.2019
comment
Я пробовал эту команду, она не обновляет контейнер с новым изображением, она запускает другой контейнер с тем же старым изображением. Итак, у меня работают два контейнера, хотя в сервисе я указал желаемое количество = 1 - person maths; 24.11.2019
comment
Для меня эта команда создает новое развертывание, однако не выбирает новый образ с тем же тегом. - person SaiNageswar S; 19.04.2020
comment
@ Дима, посмотри, пожалуйста, на мой ответ - person Jwf; 10.09.2020
comment
@maths вам нужно дождаться завершения работы старого контейнера (или вы можете завершить его самостоятельно), чтобы увидеть изменения, внесенные в новый образ. В противном случае, если у вас все еще работают 2 контейнера, старый все равно будет обрабатывать трафик. - person Kaka Ruto; 02.02.2021
comment
Вы можете установить для параметра минимального процента работоспособности значение 0, и ECS заменит старые контейнеры на новые. - person Dima; 04.02.2021
comment
Имейте в виду, что это применимо только в том случае, если вы перезаписываете изображение, а не в том случае, если вы помечаете его новой версией. - person Baron; 17.02.2021
comment
как интегрировать это с Дженкинсом? - person samshers; 21.02.2021
comment
У меня работает, когда у меня AWS::ECS::Service с DeploymentConfiguration: MinimumHealthyPercent: 50 MaximumPercent: 200 - person Wayne; 07.03.2021

Каждый раз, когда вы запускаете задачу (либо через вызовы StartTask и RunTask API, либо запускается автоматически как часть службы), агент ECS будет выполнять docker pull из image, указанных в определении задачи. Если вы используете одно и то же имя образа (включая тег) каждый раз, когда вы отправляете его в реестр, вы сможете запустить новый образ, запустив новую задачу. Обратите внимание: если Docker не может получить доступ к реестру по какой-либо причине (например, проблемы с сетью или проблемы с аутентификацией), агент ECS попытается использовать кэшированный образ; если вы хотите избежать использования кэшированных изображений при обновлении образа, вам нужно каждый раз вставлять в реестр разные теги и соответственно обновлять определение задачи перед запуском новой задачи.

Обновление: теперь это поведение можно настроить с помощью переменной среды ECS_IMAGE_PULL_BEHAVIOR, заданной в агенте ECS. Дополнительные сведения см. В документации. На момент написания поддерживаются следующие настройки:

Поведение, используемое для настройки процесса извлечения изображения для ваших экземпляров контейнера. Ниже описаны дополнительные варианты поведения:

  • Если указано default, изображение извлекается удаленно. Если получение изображения не удается, контейнер использует кэшированное изображение в экземпляре.

  • Если указано always, изображение всегда извлекается удаленно. Если получение изображения не удается, задача не выполняется. Эта опция гарантирует, что всегда будет извлекаться последняя версия образа. Любые кэшированные изображения игнорируются и подлежат автоматической очистке.

  • Если указано once, изображение извлекается удаленно, только если оно не было извлечено предыдущей задачей в том же экземпляре контейнера или если кэшированное изображение было удалено в процессе автоматической очистки образа. В противном случае используется кэшированное изображение в экземпляре. Это гарантирует, что не будут предприниматься попытки ненужного извлечения изображения.

  • Если указано prefer-cached, изображение извлекается удаленно, если нет кэшированного изображения. В противном случае используется кэшированное изображение в экземпляре. Автоматическая очистка образа отключена для контейнера, чтобы гарантировать, что кешированный образ не будет удален.

person Samuel Karp    schedule 17.01.2016
comment
Вы уверены? Я видел случаи, когда старые образы докеров запускались даже после того, как я отправил новый образ в Dockerhub (с тем же именем тега). Думаю, возможно, мне следует просто нажимать имя тега каждый раз, когда создается новое изображение. Однако, по моему опыту, такое случается довольно редко, так что, возможно, это были просто кратковременные проблемы с сетью. (Я знаю, что вы работаете над ECS, так что вы лучший человек, чтобы ответить на этот вопрос, но это не совсем то, что я испытал. Прошу прощения, если это покажется грубым, это не мое намерение!) - person Ibrahim; 06.10.2017
comment
Да, текущее поведение таково, что он будет каждый раз пытаться извлечь. В случае сбоя извлечения (проблемы с сетью, отсутствие разрешений и т. Д.) Он попытается использовать кэшированное изображение. Вы можете найти более подробную информацию в файлах журнала агента, которые обычно находятся в /var/log/ecs. - person Samuel Karp; 15.10.2017
comment
@SamuelKarp, пожалуйста, взгляните на мой ответ - person Jwf; 10.09.2020
comment
Я согласен с @Ibrahim, во многих случаях новое изображение (даже если оно правильно загружено в ECR) не будет извлечено и использовано при вызове с помощью run_task () из Lambda. Журналы CloudWatch не показывают ошибок; он просто настаивает на использовании старого образа. Действительно, очень неприятно! - person Hephaestus; 11.09.2020

AWS рекомендует зарегистрировать новое определение задачи и обновить сервис для использования нового определения задачи. Самый простой способ сделать это:

  1. Перейти к определениям задач
  2. Выберите правильную задачу
  3. Выберите создать новую ревизию
  4. Если вы уже загружаете последнюю версию образа контейнера с чем-то вроде тега: latest, просто нажмите Create. В противном случае обновите номер версии образа контейнера и нажмите «Создать».
  5. Развернуть Действия
  6. Выберите службу обновления (дважды)
  7. Затем дождитесь перезапуска службы

Это руководство содержит более подробную информацию и описывает, как вышеуказанные шаги вписываются в непрерывный процесс разработки продукта.

Полное раскрытие информации: в этом руководстве представлены контейнеры от Bitnami, и я работаю на Bitnami. Однако мысли, выраженные здесь, являются моими собственными, а не мнением Bitnami.

person Neal    schedule 26.01.2017
comment
Это работает, но вам, возможно, придется изменить минимальные / максимальные значения вашего сервиса. Если у вас есть только один экземпляр EC2, вы должны установить минимальный процент работоспособности равным нулю, иначе он никогда не убьет задачу (временно отключит вашу службу), чтобы развернуть обновленный контейнер. - person Malvineous; 04.03.2017
comment
@Malvineous Хороший вопрос! В ECS раздел настройки учебника, я описываю именно это. Вот рекомендуемая конфигурация из этого раздела: количество задач - 1, минимальный процент работоспособности - 0, максимальный процент - 200. - person Neal; 06.03.2017
comment
@Neal Я пробовал ваш подход, как указано здесь ... все еще без радости - person Hafiz; 10.05.2017
comment
@Hafiz Если вам нужна помощь, чтобы разобраться в этом, вы должны описать, как далеко вы зашли и какую ошибку вы совершили. - person Neal; 27.06.2017
comment
Это работает только для служб, а не для задач без служб. - person zaitsman; 15.09.2017
comment
Для задач без сервисов: после шага 4 вы останавливаете текущую задачу и запускаете другую, выбирая новое определение задачи (выбирая правильную ревизию). - person Ferran Maylinch; 08.12.2019
comment
На самом деле, я заметил, что если образ Docker был обновлен (с использованием той же версии), вам просто нужно остановить задачу и запустить новую с тем же определением задачи (нет необходимости создавать другое определение задачи, если параметры не нужно изменять) . - person Ferran Maylinch; 09.12.2019

Есть два способа сделать это.

Сначала используйте 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.

person Z.Wei    schedule 07.10.2019
comment
Есть ли способ сделать это, не меняя IP? У меня, когда я запускал это, он работал, но он изменил частный IP, который я использовал - person Migdotcom; 27.03.2020
comment
@Migdotcom У меня была аналогичная проблема при необходимости прокси-сервера NLB. Короче говоря, единственный способ сохранить неизменным IP-адрес экземпляра EC2 - это использовать либо эластичные IP-адреса, либо другой подход. Я не знаю вашего варианта использования, но привязка Global Accelerator к связанному с ECS ALB предоставила мне статические IP-адреса, и это решило мой вариант использования. Если вы хотите узнать динамические внутренние IP-адреса, вам нужно будет запросить ALB с помощью лямбда. Это потребовало больших усилий. Ссылка ниже: aws.amazon.com/blogs/networking-and-content-delivery/ - person Marcus; 10.05.2020
comment
aws ecs update-service --cluster ‹имя кластера› --service ‹имя службы› --force-new-deployment сработал для меня! - person gvasquez; 22.05.2020

Я создал скрипт для развертывания обновленных образов Docker в промежуточной service на ECS, так что соответствующее определение задачи относится к текущим версиям образов Docker. Я не знаю наверняка, следую ли я лучшим практикам, поэтому обратная связь будет приветствоваться.

Чтобы сценарий работал, вам нужен либо запасной экземпляр ECS, либо значение deploymentConfiguration.minimumHealthyPercent, чтобы ECS могла украсть экземпляр для развертывания обновленного определения задачи.

Мой алгоритм такой:

  1. Пометьте образы Docker, соответствующие контейнерам в определении задачи, с ревизией Git.
  2. Отправьте теги изображений Docker в соответствующие реестры.
  3. Отмените регистрацию старых определений задач в семействе определений задач.
  4. Зарегистрируйте новое определение задачи, теперь оно относится к изображениям Docker, помеченным текущими версиями Git.
  5. Обновите службу, чтобы использовать новое определение задачи.

Мой код вставлен ниже:

развертывание-ecs

#!/usr/bin/env python3
import subprocess
import sys
import os.path
import json
import re
import argparse
import tempfile

_root_dir = os.path.abspath(os.path.normpath(os.path.dirname(__file__)))
sys.path.insert(0, _root_dir)
from _common import *


def _run_ecs_command(args):
    run_command(['aws', 'ecs', ] + args)


def _get_ecs_output(args):
    return json.loads(run_command(['aws', 'ecs', ] + args, return_stdout=True))


def _tag_image(tag, qualified_image_name, purge):
    log_info('Tagging image \'{}\' as \'{}\'...'.format(
        qualified_image_name, tag))
    log_info('Pulling image from registry in order to tag...')
    run_command(
        ['docker', 'pull', qualified_image_name], capture_stdout=False)
    run_command(['docker', 'tag', '-f', qualified_image_name, '{}:{}'.format(
        qualified_image_name, tag), ])
    log_info('Pushing image tag to registry...')
    run_command(['docker', 'push', '{}:{}'.format(
        qualified_image_name, tag), ], capture_stdout=False)
    if purge:
        log_info('Deleting pulled image...')
        run_command(
            ['docker', 'rmi', '{}:latest'.format(qualified_image_name), ])
        run_command(
            ['docker', 'rmi', '{}:{}'.format(qualified_image_name, tag), ])


def _register_task_definition(task_definition_fpath, purge):
    with open(task_definition_fpath, 'rt') as f:
        task_definition = json.loads(f.read())

    task_family = task_definition['family']

    tag = run_command([
        'git', 'rev-parse', '--short', 'HEAD', ], return_stdout=True).strip()
    for container_def in task_definition['containerDefinitions']:
        image_name = container_def['image']
        _tag_image(tag, image_name, purge)
        container_def['image'] = '{}:{}'.format(image_name, tag)

    log_info('Finding existing task definitions of family \'{}\'...'.format(
        task_family
    ))
    existing_task_definitions = _get_ecs_output(['list-task-definitions', ])[
        'taskDefinitionArns']
    for existing_task_definition in [
        td for td in existing_task_definitions if re.match(
            r'arn:aws:ecs+:[^:]+:[^:]+:task-definition/{}:\d+'.format(
                task_family),
            td)]:
        log_info('Deregistering task definition \'{}\'...'.format(
            existing_task_definition))
        _run_ecs_command([
            'deregister-task-definition', '--task-definition',
            existing_task_definition, ])

    with tempfile.NamedTemporaryFile(mode='wt', suffix='.json') as f:
        task_def_str = json.dumps(task_definition)
        f.write(task_def_str)
        f.flush()
        log_info('Registering task definition...')
        result = _get_ecs_output([
            'register-task-definition',
            '--cli-input-json', 'file://{}'.format(f.name),
        ])

    return '{}:{}'.format(task_family, result['taskDefinition']['revision'])


def _update_service(service_fpath, task_def_name):
    with open(service_fpath, 'rt') as f:
        service_config = json.loads(f.read())
    services = _get_ecs_output(['list-services', ])[
        'serviceArns']
    for service in [s for s in services if re.match(
        r'arn:aws:ecs:[^:]+:[^:]+:service/{}'.format(
            service_config['serviceName']),
        s
    )]:
        log_info('Updating service with new task definition...')
        _run_ecs_command([
            'update-service', '--service', service,
            '--task-definition', task_def_name,
        ])


parser = argparse.ArgumentParser(
    description="""Deploy latest Docker image to staging server.
The task definition file is used as the task definition, whereas
the service file is used to configure the service.
""")
parser.add_argument(
    'task_definition_file', help='Your task definition JSON file')
parser.add_argument('service_file', help='Your service JSON file')
parser.add_argument(
    '--purge_image', action='store_true', default=False,
    help='Purge Docker image after tagging?')
args = parser.parse_args()

task_definition_file = os.path.abspath(args.task_definition_file)
service_file = os.path.abspath(args.service_file)

os.chdir(_root_dir)

task_def_name = _register_task_definition(
    task_definition_file, args.purge_image)
_update_service(service_file, task_def_name)

_common.py

import sys
import subprocess


__all__ = ['log_info', 'handle_error', 'run_command', ]


def log_info(msg):
    sys.stdout.write('* {}\n'.format(msg))
    sys.stdout.flush()


def handle_error(msg):
    sys.stderr.write('* {}\n'.format(msg))
    sys.exit(1)


def run_command(
        command, ignore_error=False, return_stdout=False, capture_stdout=True):
    if not isinstance(command, (list, tuple)):
        command = [command, ]
    command_str = ' '.join(command)
    log_info('Running command {}'.format(command_str))
    try:
        if capture_stdout:
            stdout = subprocess.check_output(command)
        else:
            subprocess.check_call(command)
            stdout = None
    except subprocess.CalledProcessError as err:
        if not ignore_error:
            handle_error('Command failed: {}'.format(err))
    else:
        return stdout.decode() if return_stdout else None
person aknuds1    schedule 20.01.2016
comment
@Andris Спасибо, исправлено. - person aknuds1; 21.04.2017
comment
Это перебор. Должна быть возможность развертывания через terraform или только через одну линию ecs-cli. - person holms; 04.02.2019
comment
@holms Я использую Terraform для обновления образа задачи ECS. Это такое же излишество, как и приведенный выше код Python. Требуемые шаги столь же сложны. - person Jari Turkia; 03.06.2020
comment
На самом деле излишество, я поместил в свой ответ простой сценарий, делающий то, что предлагают ответы с наивысшими оценками. Посмотри. - person Jwf; 10.09.2020
comment
github.com/silinternational/ecs-deploy выглядит излишеством, которое сохраняется. :) - person chicks; 13.11.2020

Попался в ту же проблему. Потратив несколько часов, вы завершили эти упрощенные шаги для автоматического развертывания обновленного образа:

1. Изменения в определении задачи ECS: для лучшего понимания предположим, что вы создали определение задачи с приведенными ниже деталями (примечание: эти числа будут меняться соответственно в соответствии с определением вашей задачи):

launch_type = EC2

desired_count = 1

Затем вам необходимо внести следующие изменения:

deployment_minimum_healthy_percent = 0  //this does the trick, if not set to zero the force deployment wont happen as ECS won't allow to stop the current running task

deployment_maximum_percent = 200  //for allowing rolling update

2. Отметьте свое изображение как ‹your-image-name>: latest. Последний ключ отвечает за извлечение соответствующей задачей ECS.

sudo docker build -t imageX:master .   //build your image with some tag
sudo -s eval $(aws ecr get-login --no-include-email --region us-east-1)  //login to ECR
sudo docker tag imageX:master <your_account_id>.dkr.ecr.us-east-1.amazonaws.com/<your-image-name>:latest    //tag your image with latest tag

3. нажимаем на изображение в ECR

sudo docker push  <your_account_id>.dkr.ecr.us-east-1.amazonaws.com/<your-image-name>:latest

4. примените принудительное развертывание

sudo aws ecs update-service --cluster <your-cluster-name> --service <your-service-name> --force-new-deployment --region us-east-1

Примечание. Я написал все команды, предполагая, что регион будет us-east-1. Просто замените его на свой регион при внедрении.

person Abhishek Sinha    schedule 11.06.2020
comment
Я заметил, что параметры являются параметрами терраформирования; Любые идеи, как добиться того же для CloudFormation: у меня есть AutoScalingGroup MinSize: 0 и MaxSize: 1; что еще нужно установить? - person Wayne; 24.07.2020

Следующее сработало для меня, если тег изображения докера такой же:

  1. Заходим в кластер и сервис.
  2. Выберите услугу и нажмите «Обновить».
  3. Установите количество задач как 0 и обновите.
  4. После завершения развертывания масштабируйте количество задач до 1.

Также работает следующий api:

aws ecs update-service --cluster <cluster_name> --service <service_name> --force-new-deployment
person SaiNageswar S    schedule 24.04.2020

AWS CodePipeline.

Вы можете установить ECR в качестве источника и ECS в качестве цели для развертывания.

person Guy    schedule 08.03.2019
comment
вы можете ссылку на любую документацию по этому поводу? - person BenDog; 09.07.2019

поскольку на стороне AWS не было никакого прогресса. Я дам вам простой скрипт python, который точно выполняет шаги, описанные в высоко оцененных ответах Димы и Самуэля Карпа.

Сначала нажмите изображение в ECR реестра AWS, затем запустите сценарий:

import boto3, time

client = boto3.client('ecs')
cluster_name = "Example_Cluster"
service_name = "Example-service"
reason_to_stop = "obsolete deployment"

# Create new deployment; ECS Service forces to pull from docker registry, creates new task in service
response = client.update_service(cluster=cluster_name, service=service_name, forceNewDeployment=True)

# Wait for ecs agent to start new task
time.sleep(10)

# Get all Service Tasks
service_tasks = client.list_tasks(cluster=cluster_name, serviceName=service_name)

# Get meta data for all Service Tasks
task_meta_data = client.describe_tasks(cluster=cluster_name, tasks=service_tasks["taskArns"])

# Extract creation date
service_tasks = [(task_data['taskArn'], task_data['createdAt']) for task_data in task_meta_data["tasks"]]

# Sort according to creation date
service_tasks = sorted(service_tasks, key= lambda task: task[1])

# Get obsolete task arn
obsolete_task_arn = service_tasks[0][0]
print("stop ", obsolete_task_arn)

# Stop obsolete task
stop_response = client.stop_task(cluster=cluster_name, task=obsolete_task_arn, reason=reason_to_stop)

Этот код делает:

  1. создать новую задачу с новым изображением в сервисе
  2. остановить устаревшую старую задачу старым образом в сервисе
person Jwf    schedule 10.09.2020
comment
Отлично сделано. Python делает его более читаемым и изменяемым. Я пошел с сценарием bash аналогичных шагов для моего собственного развертывания. - person AmaJayJB; 03.11.2020

Используя AWS cli, я попробовал сервис обновления aws ecs, как было предложено выше. Не забирал последний докер из ECR. В конце концов, я перезапускаю свою книгу пьес Ansible, в которой был создан кластер ECS. Версия определения задачи изменяется при запуске ecs_taskdefinition. Тогда все хорошо. Подбирается новый образ докера.

По правде говоря, не уверен, вызывает ли изменение версии задачи повторное развертывание или playbook, использующий ecs_service, вызывает перезагрузку задачи.

Если кому-то интересно, я получу разрешение на публикацию очищенной версии моего плейбука.

person mpechner    schedule 23.05.2018
comment
Я считаю, что пересмотр определения задачи требуется только тогда, когда вы обновляете фактическую конфигурацию определения задачи. в этом случае, если вы используете изображение с последним тегом, нет необходимости изменять конфигурацию? Конечно, иметь идентификатор фиксации в качестве тега - это хорошо, а также иметь отдельную ревизию определения задачи, чтобы вы могли откатиться, но тогда ваш CI увидит все учетные данные, которые вы используете для контейнера, что я не хочу реализовывать. - person holms; 04.02.2019

ну, я также пытаюсь найти автоматический способ сделать это, то есть внести изменения в ECR, а затем последний тег должен быть получен службой. Правильно, вы можете сделать это вручную, остановив задачу для вашей службы из вашего кластера. Новые задачи потянут обновленные контейнеры ECR.

person Avijeet    schedule 14.05.2019
comment
см. мой ответ ниже - person Jwf; 10.09.2020

Следующие команды работали для меня

docker build -t <repo> . 
docker push <repo>
ecs-cli compose stop
ecs-cli compose start
person explorer    schedule 19.02.2018
comment
Откуда вообще эти строки ecs-cli? - person Ramzi C.; 26.06.2018