Вот что я вижу в этой последовательности:
ENTRYPOINT ["bash", "/docker-entrypoint.sh"]
CMD ["bash", "/home/test/app/start.sh"]
Когда вы запускаете контейнер, Docker запускает bash /docker-entrypoint.sh bash /home/test/app/start.sh
. Однако сценарий точки входа никогда не просматривает свои аргументы командной строки, поэтому любая CMD
, указанная вами здесь, или любая команда, которую вы даете в конце командной строки docker run
, полностью игнорируется.
Когда выполняется сценарий этой точки входа:
exec gunicorn ... &
exec service nginx start
# end of file
запускается gunicorn
как фоновый процесс и продолжается до следующей строки; затем он заменяет себя командой service
. Эта команда service
становится основным контейнерным процессом и имеет идентификатор процесса 1. Она запускает nginx и немедленно возвращается. Теперь, когда основной процесс контейнера возвращен, контейнер завершает работу.
Для того кода, который вы написали, вы должны удалить строки exec
в конце сценария точки входа и заменить их просто
exec "$@"
, что заставит оболочку запустить параметры командной строки (то есть Dockerfile CMD
).
Однако, есть легкодоступное изображение Dogin nginx . Как правило, если вам нужно несколько процессов, проще и лучше запускать их как два отдельных контейнера в одной сети Docker. Это позволяет избежать сложностей, связанных с попытками запустить несколько вещей в одном контейнере.