1. 前言
ENTRYPOINT
和CMD
都是Dockerfile
中的命令,两者都是用来:指定默认的容器的主进程的启动命令。那么接下来就介绍一下这两者在Dockerfile
中,以及Docker
中的如何使用,以及区别和联系。
2. CMD
命令
首先介绍一下 CMD
命令,命令分为两种格式, 一种是shell
,另一种是 exec
shell
:CMD <命令>
exec
:CMD ["可执行文件","参数1","参数2"...]
既然 CMD
命令是用来指定默认的容器的主进程的启动命令的,那么我们就可以用新的命令来替代这个命令啦。
当我们直接输入docker run --rm -it ubuntu:14.04
的时候,是默认进入Bash
的,如下图所示:
那么如果我们想换一种方式,那么怎么办呢,很简单。我们自己构建一个镜像来演示(基于ubuntu:14.04
)。
假如我们想一运行镜像,就输出一条信息,“Hello,Robert!”
Dockerfile
中如下所示:
保存退出后,我们输入命令docker build -t cmddemo .
构建镜像,
然后运行 docker run --rm cmddemo
发现控制台输出 Hello,Robert!
运行成功。
2.1 注意1
在指令格式上,一般推荐使用exec
格式,这类格式在解析时 会被解析成JSON
数组,因此一定要用双引号,而不要使用单引号。
如果使用Shell
格式的话,实际执行中,会被转换成exec
命令。比如
CMD echo hello
转换成
CMD ["sh", "-c" , "echo 'hello'"]
2.2 注意2
Docker
不是虚拟机,容器中的应用都应该前台执行,而不是像虚拟机,物理机里面那样,用upstart
和systemd
去启动后台程序。容器中没有后台服务的概念。
3. ENTRYPOINT
命令
ENTRYPOINT
和 CMD
格式一样,分为shell
和exec
两种格式。 ENTRYPOINT
和CMD
的目的一样,都是指定容器启动程序及其参数。当指定ENTRYPOINT
后, CMD
的含义就发生了改变,不再是直接运行其命令,而是将CMD
的内容作为参数 传给ENTRYPOINT
,换句话说实际执行就变成了如下
<ENTRYPOINT> "<CMD>"
其实ENTRYPOINT
用起来和CMD
差不多,但是还麻烦点,麻烦有麻烦的好处。
Dockerfile
中的代码如下:
然后在构建完,运行可看见如下:
接下来讲述 CMD
和ENTRYPOINT
配合起来使用的。
Dockerfile 中如下:
然后构建运行,得到
运行 docker run --rm demo "echo 'Hello,Audience!'"
则会把CMD
中的内容直接替换掉,结果如下图所示: