-
ENTRYPOINT
和CMD
都是让用户指定一个可执行程序
- 这个可执行程序在
container
启动后自动启动
.
- 这个可执行程序在
-
如果你想让自己制作的镜像自动运行程序(不需要在docker run后面添加命令行指定运行的命令) , 则必须在
Dockerfile
里面, 使用ENTRYPOINT
或者CMD命令- 否则执行运行一个没有调用
ENTRYPOINT
或者CMD
的docker
镜像, 一定返回错误
- 否则执行运行一个没有调用
规则
覆盖
在写
Dockerfile
时,ENTRYPOINT
或者CMD
命令会自动覆盖之前的ENTRYPOINT
或者CMD
命令.-
我们也可以在命令行启动
docker
镜像时, 执行其他命令行参数, 覆盖默认的CMD
- 如下,覆盖命令为
hostname
docker run demo hostname
- 如下,覆盖命令为
-
和
CMD
类似, 默认的ENTRYPOINT
在docker run
时也可以被覆盖.- 在运行时, 用
--entrypoint
覆盖默认的ENTRYPOINT
docker run --entrypoint
- 在运行时, 用
区别
- 可见,用户在执行
docker run
的时候,CMD
的默认程序比ENTRYPOINT
更容易被覆盖
写法(Shell vs. Exec)
-
ENTRYPOINT
和CMD
指令都支持2种不同的写法:-
shell
表示法和exec
表示法
-
下面的例子使用了shell表示法:
CMD executable param1 param2
当使用
shell
表示法时,命令行程序
作为sh程序
的子程序
运行(docker
用/bin/sh -c
的语法调用命令行程序
)如果我们用
docker ps
命令查看运行的docker
, 就可以看出实际运行的是/bin/sh -c
命令-
虽然
shell表示法
看起来可以顺利工作, 但是它其实上有一些小问题存在.- 由于
/bin/sh
命令不会转发消息给实际运行的子程序
命令, 所以不能安全得关闭docker
容器 - 如果镜像没有
shell
程序,使用shell的表示法
会导致docker
容器不能运行.
- 由于
exec表示法:
CMD ["executable","param1","param2"]
- 它没有
shell的表示法
的缺点
ENTRYPOINT 和 CMD 组合使用
在某种情况下, 组合
ENTRYPOINT
和CMD
能发挥更大的作用-
ENTRYPOINT
指定默认的运行命令,CMD
指定默认的运行参数.-
ENTRYPOINT
和CMD
同时存在时,docker
会把CMD
的命令拼接到ENTRYPOINT
命令之后
-
例子
FROM ubuntu:trusty
ENTRYPOINT ["/bin/ping","-c","3"]
CMD ["localhost"]
- 这里
docker
最终运行的命令是:ping -c 3 localhost