@JunQiu
2018-11-28T16:57:02.000000Z
字数 2319
阅读 1330
docker
summary_2018/11
CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)
ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred)
ENTRYPOINT command param1 param2 (shell form)
ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred)
ENTRYPOINT command param1 param2 (shell form)
// shell模式
dockerfile:
FROM ubuntu:trusty
ENTRYPOINT ping localhost
14:37:45 › docker exec 9d9104d29128 ps -f
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 06:35 ? 00:00:00 /bin/sh -c ping localhost
root 6 1 0 06:35 ? 00:00:00 ping localhost
root 7 0 0 06:38 ? 00:00:00 ps -f
可以看到pid=1的shell进程,而不是我们运行的进程
// exec模式
FROM ubuntu:trusty
ENTRYPOINT ["ping","localhost"]
15:10:11 › docker exec d0caad39e3c7 ps -f
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 07:10 ? 00:00:00 ping localhost
root 9 0 0 07:10 ? 00:00:00 ps -f
Tips:运行的进程pid=1,而不是shell进程,可以接受到SIGTERM信号
// exec使用其它shell
FROM ubuntu:trusty
ENTRYPOINT ["sh", "-c","ping localhost"]
15:06:59 › docker exec dca700a76b8f ps -f
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 07:06 ? 00:00:00 sh -c ping localhost
root 7 1 0 07:06 ? 00:00:00 ping localhost
root 8 0 0 07:07 ? 00:00:00 ps -f
因此:当exec模式使用其它shell,可以看到pid=1的shell进程,因为此时把运行shell进程当作我们自身的进程的一部分
1、shell模式:使用/bin/sh-c执行,shell进程作为pid=1的,执行的命令作为shell进程的子进程运行;
docker stop <container>:当使用stop命令停止时,会首先容器中pid=1的进程发送SIGTERM信号,而不会转发给它的子进程,并给予一定时间10s缓冲(可以设置),当时间超时后才使用-9强杀;因此这种情况会导致容器内的服务毫无征兆的被杀死。
2、exec模式:exec作为shell的内键命令,不会启动新的shell进程,而是使用执行的命令来替换当前进程,使pid=1,能够收到SIGTERM信号;
// 查看上面的image
docker inspect xxx
//shell 模式
"ENTRYPOINT": [
"/bin/sh",
"-c",
"ping localhost"
]
// exec
"ENTRYPOINT": [
"ping",
"localhost"
],
// exec shell
"ENTRYPOINT": [
"sh",
"-c",
"ping localhost"
]
Tips:
1、我们可以看出ENTRYPOINT传递参数其实就是在json数组后加参数,比如shell模式给/bin/sh加参数,上面的exec就是给ping加参数;当然参数不符合就会失败。
2、虽然有shell、和exec两种方式,最后都被解析成了数组的格式。