Dockerfile的ENTRYPOINT和CMD

ENTRYPOINT和CMD指令支持2种不同的写法: shell表示法和exec表示法
当使用shell表示法时, 命令行程序作为sh程序的子程序运行

虽然shell表示法看起来可以顺利工作, 但是它其实上有一些小问题存在.
PID为1的进程并不是在Dockerfile里面定义的ping命令, 而是/bin/sh命令. 如果从外部发送任何POSIX信号到docker容器, 由于/bin/sh命令不会转发消息给实际运行的ping命令, 则不能安全得关闭docker容器(参考更详细的文档:Gracefully Stopping Docker Containers).

使用了shell表示法(无中括号):
CMD executable param1 param2

用exec表示法(有中括号):
CMD [“executable”,”param1″,”param2″]

组合使用ENTRYPOINT和CMD, ENTRYPOINT指定默认的运行命令, CMD指定默认的运行参数. 例子如下:

FROM ubuntu:trusty
ENTRYPOINT [“/bin/ping”,”-c”,”3″]
CMD [“localhost”]

ENTRYPOINT和CMD同时存在时, docker把CMD的命令拼接到ENTRYPOINT命令之后, 拼接后的命令才是最终执行的命令. 但是由于上文说docker run命令行执行时, 可以覆盖CMD指令的值. 如果你希望这个docker镜像启动后不是ping localhost, 而是ping其他服务器,, 可以这样执行docker run:
docker run ping docker.io

也就说CMD可以被覆盖

组合使用ENTRYPOINT和CMD命令式, 确保你一定用的是Exec表示法

此条目发表在其他分类目录,贴了标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。

*