Docker-контейнер живет до тех пор, пока процесс, который вы указали для его запуска, не завершился.
Docker-контейнеры не используют демонов и сервисы - вы должны запускать ваш процесс впередний план контейнера.Это рекомендуемое использование контейнеров - хотя вы можете заставить его делать иначе, если хотите.
Что-то, что мне очень помогло концептуально, это думать больше о контейнере докера как о «изоляции процесса»механизм, а не его как ящик с программным обеспечением, которое вы можете запускать и останавливать.
Это руководство может оказаться полезным, если вы хотите запустить несколько процессов в контейнере: https://docs.docker.com/config/containers/multi-service_container/
Небольшая хитрость заключается в добавлении неопределенно запущенной команды в конец докера ENTRYPOINT или CMD.Один используемый комментарий - tail -f /dev/null
, например:
systemctl start myservice && tail -f /dev/null
Не могу сказать, что могу порекомендовать это, но вполне вероятно, что он сделает то, что вы хотите.
Я включуЗдесь минимальный пример того, как это можно использовать.Вот Dockerfile, где указывается ENTRYPOINT для запуска службы (работает в фоновом режиме), а затем настраивается нулевое устройство, / dev / null:
FROM ubuntu
RUN apt-get update
RUN apt-get install -y apache2
ENTRYPOINT service apache2 start && tail -f /dev/null
Создайте его с помощью:
docker build -t servicetest:01 .
Начните с:
docker run -p 8080:80 servicetest:01
И посетите http://localhost:8080, чтобы увидеть, как оно работает