Шаг CMD
в Dockerfile устанавливает метаданные на образе, сообщая докеру команду по умолчанию, которая должна выполняться при запуске контейнера. Вы можете иметь только одно значение для CMD
, поэтому при повторной установке все предыдущие настройки будут перезаписаны.
Для контейнеров может быть запущен только один процесс, и этот процесс запускается как pid 1 внутри контейнера. Как только этот процесс завершается, весь контейнер останавливается, включая любые фоновые процессы.
Поэтому вам нужно установить CMD
для любой команды или сценария, который вы хотите запустить, и эта команда должна оставаться запущеннойна время жизни вашего контейнера. Это может быть так же просто, как запуск tail -f /dev/null
, как в последней строке вашего скрипта. Однако рекомендуемая практика - запускать приложение на переднем плане, а не в фоновых демонах, которые могут неожиданно зависать. Я бы очень хотел, чтобы внутри контейнера было несколько демонов, есть такие инструменты, как supervisord. Но в большинстве случаев лучше запускать несколько контейнеров, по одному на службу, и обмениваться данными между этими службами через общую сеть докеров. docker-compose
очень полезно для настройки этой сети и развертывания ваших контейнеров с соответствующими конфигурациями.