Стратегии для принятия решения о том, когда использовать "запуск докеров" и "запуск докеров" и использование последней версии данного изображения

Я докционирую некоторые из наших услуг. Для нашей среды разработчиков я хотел бы сделать все как можно проще для наших разработчиков, поэтому я пишу несколько скриптов для управления докционированными компонентами. Я хочу, чтобы разработчики могли запускать и останавливать эти службы так же, как если бы они были неблокированы. Я не хочу, чтобы им приходилось беспокоиться о создании и запуске контейнера против остановки и запуска и уже созданного контейнера. Я думал, что это можно обработать с помощью Рис. Чтобы создать контейнер (если он еще не существует) и запустите службу, я бы использовал fig up --no-recreate. Чтобы остановить службу, я бы использовал fig stop.

Я также хотел бы обеспечить, чтобы разработчики запускали контейнеры, созданные с использованием последних изображений. Другими словами, что-то проверит, чтобы увидеть, была ли более поздняя версия изображения в нашем реестре Docker. Если это так, это изображение будет загружено и запущено для создания нового контейнера из этого изображения. На данный момент мне кажется, что мне нужно будет использовать команды докеров, чтобы отобразить содержимое реестра (docker search) и сравнить его с существующими локальными контейнерами ( docker ps -a) с добавлением некоторых grep ing и awk ing или использования Docker API для достижения того же самого.

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

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

Ответ 1

Вот что я решил сделать для нашего изображения Neo4j Docker:

Я написал оболочку script вокруг docker run, которая принимает аргументы командной строки для порта, каталога сохранения базы данных в хосте, каталога сохранения файлов журнала на хосте. Он выполняет команду docker run, которая выглядит так:

docker run --rm -it -p ${port}:7474 -v ${graphdir}:/var/lib/neo4j/data/graph.db -v ${logdir}:/var/log/neo4j  my/neo4j

По умолчанию порт равен 7474, graphdir - $PWD/graph.db, а logdir - $PWD/log.

--rm удаляет контейнер при выходе, однако база данных и журналы поддерживаются в файловой системе хоста. Таким образом, контейнеров не осталось.

-it позволяет контейнеру и службе Neo4j, работающим внутри него, принимать сигналы, чтобы услуга могла быть изящно отключена (сервер Neo4j изящно отключается на SIGINT), и контейнер выходил, нажав ^ C или отправив его SIGINT, если разработчик помещает это в фоновом режиме. Нет необходимости в отдельных командах запуска/остановки.

Хотя я, конечно, не сделал бы этого в производстве, я думаю, что это нормально для среды разработчиков.

Ответ 2

Я не знаком с фигом, но ваш сценарий кажется хорошим.

Обычно, я предпочитаю убивать/удалять + запускать свой контейнер вместо того, чтобы играть с запуском/остановкой. Таким образом, если будет доступно новое изображение, Docker будет использовать его. Это работает только для служб без гражданства. Когда вы используете тома для постоянных данных, вы можете сделать что-то вроде этого.

Что касается обновления изображения, как насчет запуска docker pull <image> каждые N минут и проверки "статуса", возвращаемого командой? Если он обновлен, то ничего не делайте, иначе уничтожьте/запустите контейнер.