У меня есть докер-контейнер с установленным и настроенным программным обеспечением.
Нет никакой программы, которая должна быть запущена / запущена все время.
Что я хочу - это возможность запуска какой-то команды в зависимости от внешних событий. нравится:
docker exec mysupercont /path/to/mycommand -bla -for
а также
docker exec mysupercont /path/to/myothercommand
Но «exec» невозможен, когда контейнер остановлен, а также у этого контейнера есть некоторые «рабочие» данные внутри, которые используются для этих команд, поэтому я не могу использовать
docker run ...
каждый раз, потому что он воссоздает контейнер из изображения и уничтожает мои данные.
Каков «правильный» и «лучший» способ сохранить такой контейнер в рабочем состоянии? Какую команду я могу запустить внутри?
docker run -d --name=name container tail -f /dev/null
Ответы:
Вам не нужно выполнять каждый раз
docker run
.docker run
на самом деле последовательность двух команд: «создать» и «начать».Когда вы запускаете контейнер, вы должны указать "
-it
":Пример:
После завершения работы команда указывается при запуске (в моем примере bash). Например, вы выполняете «выход». Контейнерные остановки:
Теперь вы можете начать это снова
Контейнер запускается и снова выполняет команду «bash».
Подключитесь к этому сеансу «bash» с помощью команды
Подводя итог : вы должны понимать разницу между
run
иstart
контейнером.Кроме того, посмотрите документацию на роль параметров «
-i t
» и «-d
» для «Выполнить»источник
docker attach ID
. Выйти из этого сеанса без окончания bash, вы можете использоватьCTRL-p CTRL-q
Весь этот вопрос о том, можете ли вы запустить остановленный контейнер, зависит от того, как контейнер был изначально создан, т.е. запущен. Если вы выполнили команду, которая завершилась, или вы выходите из интерактивной команды, например, bash, вы не можете запустить, перезапустить или выполнить остановленный контейнер. Все, что вы можете сделать, это удалить его. Это барахло.
Но последний комментарий Таранаки, использующий '-itd', похоже, был тем, что приказал докер.
Контейнер продолжает работать, и вы можете выполнить все, что захотите, а также можете остановить, запустить или перезапустить контейнер. Конечно, это всего лишь предварительный вывод, основанный на альпийском изображении. Обратите внимание, что если вы подключите контейнер, он остановится при выходе, но вы сможете запустить его снова.
источник
Поскольку вы упомянули периодические задания и, вероятно, из-за того, как вы хотите их использовать
docker exec
, вы используете что-то вроде cron , у меня есть только лекарство для вас. По крайней мере, в итоге я сделал что-то подобноеDockerfile
Беги с обычным
docker run -d ....
(я использовалdocker-compose
)Настройте хост-машины crontab, например:
Я нахожу это решение хорошим, поскольку мы можем положиться на древний и проверенный crontab в довольно красивой среде linux, в то время как Docker обрабатывает более экзотические ошибки и переменные среды вашей бизнес-логики. Вы также можете установить некоторые ограничения, если ваши периодические задачи застряли и имеют утечки памяти или что-то еще.
источник
Хвост все равно время от времени вызывает некоторые файловые операции.
Вот мое решение спать вечно, без каких-либо побочных эффектов.
Как это работает
источник