了解 Dockerfile CMD/ENTRYPOINT

Understanding Dockerfile CMD/ENTRYPOINT

我是 Docker 的新手。尝试使用 Transmission 构建小图像。 这是我的Docker文件:

#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 如何在容器内运行应用程序,我缺少什么?

Docker 只要容器启动的进程处于活动状态,容器就会保持 运行ning。如果您的容器在 运行 时启动守护进程,那么守护进程启动脚本就是进程 Docker 监视。完成后,容器退出 - 因为 Docker 没有监视脚本生成的后台进程。

通常您的 CMDENTRYPOINT 将 运行 交互进程而不是守护进程,并且您让 Docker 负责将容器置于后台docker run -d。 (CMDENTRYPOINT 之间的实际差异约为 giving users flexibility to run containers from your image in different ways)。

如果您正在查看 运行 在容器中安装已建立的应用程序,那么值得检查 Docker 中心。 There are a bunch of Transmission images on Docker Hub 您可以直接使用,或查看他们的 Docker 文件以查看图像是如何构建的。