Понимание 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, чтобы посмотреть, как создается этот образ.

Другие вопросы по тегам