[关闭]
@JunQiu 2018-11-28T16:57:02.000000Z 字数 2319 阅读 1351

dockerFile:CMDvsENTRYPOINT、shellVSexec

docker summary_2018/11


1、CMD vs ENTRYPOINT

  1. CMD ["executable","param1","param2"] (exec form, this is the preferred form)
  2. CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
  3. CMD command param1 param2 (shell form)
  1. ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred)
  2. ENTRYPOINT command param1 param2 (shell form)

2、shell VS exec

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

3、参考

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注