@JunQiu
2018-11-28T08:57:02.000000Z
字数 2319
阅读 1649
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:trustyENTRYPOINT ping localhost14:37:45 › docker exec 9d9104d29128 ps -fUID PID PPID C STIME TTY TIME CMDroot 1 0 0 06:35 ? 00:00:00 /bin/sh -c ping localhostroot 6 1 0 06:35 ? 00:00:00 ping localhostroot 7 0 0 06:38 ? 00:00:00 ps -f可以看到pid=1的shell进程,而不是我们运行的进程// exec模式FROM ubuntu:trustyENTRYPOINT ["ping","localhost"]15:10:11 › docker exec d0caad39e3c7 ps -fUID PID PPID C STIME TTY TIME CMDroot 1 0 0 07:10 ? 00:00:00 ping localhostroot 9 0 0 07:10 ? 00:00:00 ps -fTips:运行的进程pid=1,而不是shell进程,可以接受到SIGTERM信号// exec使用其它shellFROM ubuntu:trustyENTRYPOINT ["sh", "-c","ping localhost"]15:06:59 › docker exec dca700a76b8f ps -fUID PID PPID C STIME TTY TIME CMDroot 1 0 0 07:06 ? 00:00:00 sh -c ping localhostroot 7 1 0 07:06 ? 00:00:00 ping localhostroot 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信号;
// 查看上面的imagedocker 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两种方式,最后都被解析成了数组的格式。
