Как держать контейнер работающим после запуске стартового скрипта .sh?

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

1. Один из наиболее распространенных способов - использовать команду CMD или ENTRYPOINT в Dockerfile для указания команды или скрипта, который будет выполняться в контейнере при его старте. Например, если вам нужно запустить скрипт startup.sh, вы можете добавить в Dockerfile следующую строку:

CMD ["./startup.sh"]

или

ENTRYPOINT ["./startup.sh"]

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

2. Если вам нужно запустить контейнер с командой только на время выполнения скрипта и контейнер должен остановиться после его завершения, вы можете использовать флаг --rm при запуске контейнера. Например:

docker run --rm myimage ./startup.sh

При использовании этого флага контейнер будет автоматически удален после завершения выполнения команды.

3. Для более сложных случаев, когда вы хотите оставить контейнер работающим после выполнения стартового скрипта, может потребоваться использовать инструмент управления процессами, такой как 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, описанные выше.