-
ENTRYPOINT和CMD都是让用户指定一个可执行程序- 这个可执行程序在
container启动后自动启动.
- 这个可执行程序在
-
如果你想让自己制作的镜像自动运行程序(不需要在docker run后面添加命令行指定运行的命令) , 则必须在
Dockerfile里面, 使用ENTRYPOINT或者CMD命令- 否则执行运行一个没有调用
ENTRYPOINT或者CMD的docker镜像, 一定返回错误
- 否则执行运行一个没有调用
规则
覆盖
在写
Dockerfile时,ENTRYPOINT或者CMD命令会自动覆盖之前的ENTRYPOINT或者CMD命令.-
我们也可以在命令行启动
docker镜像时, 执行其他命令行参数, 覆盖默认的CMD- 如下,覆盖命令为
hostnamedocker run demo hostname
- 如下,覆盖命令为
-
和
CMD类似, 默认的ENTRYPOINT在docker run时也可以被覆盖.- 在运行时, 用
--entrypoint覆盖默认的ENTRYPOINTdocker 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