Для того чтобы держать контейнер работающим после запуска стартового скрипта .sh в Docker, есть несколько подходов.
- Один из наиболее распространенных способов - использовать команду
CMD
илиENTRYPOINT
в Dockerfile для указания команды или скрипта, который будет выполняться в контейнере при его старте. Например, если вам нужно запустить скрипт startup.sh, вы можете добавить в Dockerfile следующую строку:
CMD ["./startup.sh"]
или
ENTRYPOINT ["./startup.sh"]
Обратите внимание, что если используется CMD
, то можно переопределить команду в командной строке при запуске контейнера, а если используется ENTRYPOINT
, то команда будет неизменной и будет выполняться всегда.
- Если вам нужно запустить контейнер с командой только на время выполнения скрипта и контейнер должен остановиться после его завершения, вы можете использовать флаг
--rm
при запуске контейнера. Например:
docker run --rm myimage ./startup.sh
При использовании этого флага контейнер будет автоматически удален после завершения выполнения команды.
- Для более сложных случаев, когда вы хотите оставить контейнер работающим после выполнения стартового скрипта, может потребоваться использовать инструмент управления процессами, такой как
supervisor
. Например, вы можете установитьsupervisor
внутри вашего контейнера и настроить его для запуска стартового скрипта и управления процессом. Ваш Dockerfile может выглядеть примерно так:
FROM ubuntu:latest RUN apt-get update && apt-get install -y supervisor COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY startup.sh /usr/local/bin/startup.sh CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
В этом примере supervisord.conf
- это конфигурационный файл supervisor
, в котором вы можете указать команды для запуска и управления процессами внутри контейнера.
Также следует отметить, что контейнеры Docker по умолчанию работают в режиме "одного процесса", что означает, что контейнер будет остановлен, если процесс, указанный в CMD
или ENTRYPOINT
, завершится. Если вам требуется запустить и управлять несколькими процессами внутри контейнера, вы можете использовать инструменты, такие как systemd
или runit
, либо использовать подходы на основе supervisor
, описанные выше.