Сохраните работающий контейнер ECS как новый образ и загрузите в ECR

Я запускаю Docker-контейнеры Apache, MySQL и memcached из AWS ECR в экземпляр ECS. Инженеры могут просматривать и вносить изменения по своему усмотрению. Срок действия этих контейнеров истекает через установленный период времени, но они хотят сохранить изменения своей базы данных для использования в будущих контейнерах.

Я изучаю, есть ли решение, которое я могу автоматизировать, чтобы этот процесс происходил до завершения контейнеров, с помощью Lambda, aws-cli или какой-либо другой утилиты.

Я ищу решение, которое возьмет контейнер mysql и создаст из него новый образ. Я видел этот вопрос, и в основном это то, что мне нужно: Как создать новый образ докера из работающего контейнера на Amazon?

Но вы должны запустить docker commit из экземпляра ECS, а также выполнить вход и нажать оттуда. Похоже, что нет способа отправить зафиксированное изображение в ECR без необходимости входа в систему с aws ecr get-login --no-include-email и запуска вывода для докера, чтобы получить токен.

Проблема, с которой я сталкиваюсь, заключается в том, что если мы дойдем до точки, когда у нас будет запущено несколько экземпляров ECS, будет трудно узнать, из какого контейнера запущен инженер, подключиться по SSH к этому серверу и запустить docker commit, docker tag, aws ecr login и docker push команд. Мне это кажется хакерским и подверженным ошибкам.

Я перестраиваю контейнеры MySQL и отправляю их в ECR каждый час, чтобы у них были последние обновления содержимого. Для запуска контейнеров я использую комбинацию ecs-cli и aws-cli, чтобы использовать файл docker-compose.yml для создания задачи в ECS.

Есть ли какие-то функции, которые я могу использовать для фиксации работающего контейнера в ECR с новым именем / тегом?

Другой вариант, который я рассматривал, - это запуск контейнера MySQL с постоянным хранилищем (EBS / EFS), но я все еще пытаюсь проверить, выполнимо ли это, поскольку мне пришлось бы как-то пометить постоянное хранилище, чтобы оно использовалось только при запуске инженером это так. По сути, у меня был бы уникальный файл docker-compose.yml, специфичный для постоянных томов, и он либо запускал бы новый контейнер со свежими данными mysql, либо использовал бы существующий, если он существует, с заданным именем.


person Kurt Knudsen    schedule 02.05.2019    source источник
comment
Когда я определяю том в файле docker-compose.yml, кажется, что он не сохраняется, а также добавляет некоторые дополнительные данные к имени тома. Думаю, я попытаюсь использовать тома в параметрах ecs-params, yml, но я не хотел помещать все 3 контейнера в одно хранилище, поскольку это было бы пустой тратой.   -  person Kurt Knudsen    schedule 02.05.2019
comment
Вы можете увидеть, соответствует ли RDS (и моментальный снимок базы данных как объект в API AWS) вашим потребностям здесь. Трудно создать образ MySQL, который уже содержит данные и docker commit в целом, как правило, не рекомендуется (что именно ваши разработчики сделали с помощью docker exec в этих контейнерах и как мы можем воспроизвести это?).   -  person David Maze    schedule 03.05.2019
comment
Я не знаю, жизнеспособна ли RDS, если у нас есть несколько десятков инженерных систем. У инженеров нет прямого доступа к контейнерам, все это доступно через веб-браузеры, в основном тестирование функциональности. Они просто хотят иметь возможность сохранять тестовые данные в течение более длительных периодов времени, не повторяя их каждый раз, когда они запускают экземпляр. Переход на RDS может быть выходом за рамки проекта и, в конце концов, может никогда не быть одобрен, поскольку мы уже контейнеризованы и работоспособны. Я ценю отзывы и буду продолжать поиск решений.   -  person Kurt Knudsen    schedule 03.05.2019
comment
В итоге я создал пустой контейнер Docker для mysql, и, когда основной экземпляр раскручивается, он получает базу данных из S3 и импортирует ее. Если планируется сохранить базу данных, она выполняет дамп, gzip и выгружает его в S3 перед завершением работы экземпляра. Это делается с помощью сценария очистки, который напрямую подключается по SSH к контейнеру Docker, когда у него есть сопоставленный порт SSH, доступный из нашей сети. Это не идеально, но работает и кажется достаточно стабильным для нашего использования.   -  person Kurt Knudsen    schedule 23.05.2019