Понимание Dockerfile CMD/ENTRYPOINT
Я новичок в Докере. Попытка построить маленькое изображение с передачей. Вот мой Dockerfile:
#base image
FROM alpine:latest
#install Transmission
RUN apk update
RUN apk add transmission-daemon
#expose port
EXPOSE 9091
#start app
CMD ["/usr/bin/transmission-daemon"]
Затем я запускаю контейнер:
docker run transmission
и это немедленно выходит. Я предполагал, что он будет работать, так как демон передачи должен продолжать работать. Я также пробовал ENTRYPOINT, но результат тот же. Однако следующая версия работает как положено:
ENTRYPOINT ["/usr/bin/transmission-daemon"]
CMD ["-h"]
Он запускается, показывает справку по передаче и завершает работу. Чего мне не хватает в том, как Docker запускает приложения внутри контейнеров?
1 ответ
Docker поддерживает работу контейнера до тех пор, пока активен процесс, который запускает контейнер. Если ваш контейнер запускает демон при запуске, то сценарий запуска демона - это процесс, который отслеживает Docker. Когда это завершится, контейнер закроется - потому что Docker не наблюдает за фоновым процессом, который запускает скрипт.
Как правило, ваш CMD
или же ENTRYPOINT
будет запускать интерактивный процесс, а не демонизированную версию, и вы позволите Docker позаботиться о том, чтобы поместить контейнер в фоновый режим с помощью docker run -d
, (Фактическая разница между CMD
а также ENTRYPOINT
о предоставлении пользователям гибкости для запуска контейнеров из вашего образа различными способами).
Стоит проверить Docker Hub, если вы хотите запустить установленное приложение в контейнере. В Docker Hub имеется множество изображений Transmission, которые вы можете использовать напрямую или проверить их файлы Docker, чтобы посмотреть, как создается этот образ.