Такие команды, как service
и systemctl
, в основном просто не работают в Docker, и вы должны полностью их игнорировать.
В тот момент, когда выполняется сценарий точки входа, это буквально единственная вещьэто работает. Это означает, что вам не нужно перезапускать nginx, потому что он еще не запустился в первый раз. Стандартный шаблон здесь - использовать скрипт точки входа для первоначальной настройки;ей будет передана фактическая команда для запуска в качестве аргументов, поэтому вы должны указать ей, чтобы они запускались.
#!/bin/sh
echo "in entrypoint"
# ... do first-time setup ...
# ...then run the command, nginx or otherwise
exec "$@"
(Попробуйте запустить docker run --rm -it myimage /bin/sh
. Вы получите интерактивную оболочку в новом контейнере, но после эта первоначальная настройка произошла.)
Единственное, что вы теряете в своем Dockerfile, это значение по умолчанию CMD
из базового образа (установка ENTRYPOINT
сбрасывает это),Вам необходимо добавить обратно , что CMD
:
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["nginx", "-g", "daemon off;"]
Вы должны сохранить другие настройки из базового образа, такие как ENV
определения и EXPOSE
d порты.