docker cmd and entrypoint questions
This project is maintained by wangfakang
关于dockerfile中CMD以及ENTRYPOINT命令的解析:
之前只是对这两个命令简单做了下解释,但是今天实战了一下 踩了一些坑:
首先说一些CMD的写法吧:
CMD 有三种写法:
CMD "executable","param1","param2"
CMD "param1","param2"
CMD command param1 param2 (shell form)
在所写的CMD [] 方式的时候一定要注意CMD 和[]之间是要空格隔开的,否则build就会出错.
在写下面格式CMD时候:
之前一直认为CMD中命令只会被run后面同样的命令覆盖,其实不是这样的,而是都是可以替代的.
通过查看docker inspect查看image,看到CMD ["execute"] 和 CMD execute的区别:
如:
"Cmd": [
"/bin/echo",
"test"
]
"Cmd": [
"/bin/sh",
"-c",
"/bin/echo \"test\""
]
看到了嘛,不要[]会多一个/bin/sh -c.也就是说CMD后面不要中括号的话则是在shell中执行.而有中括号的则 exec:shell的内建命令exec将并不启动新的shell,而是用要被执行命令替换当前的shell进程,并且将老进程的环 境清理掉,而且exec命令后的其它命令将不再执行。
还有一个简单的现象可以对比:
CMD echo $HOME 命令最终解析为: "Cmd": [ "/bin/sh", "-c", "#(nop) CMD [/bin/sh -c echo $HOME]" ]
CMD ["echo", "$HOME"] 命令最终解析为:
"Cmd": [
"/bin/sh",
"-c",
"#(nop) CMD [echo $HOME]"
]
以上两条在第一个中$HOME可以被解析出来,而第二个却输出$HOME字符串. 其实官网上有解决办法:CMD ["/bin/sh", "-c", "echo", "$HOME"]
"Cmd": [
"/bin/sh",
"-c",
"#(nop) CMD [/bin/sh -c echo $HOME]"
]
这样的话效果就和CMD echo $HOME一样了.
"Cmd": [
"/bin/sh",
"-c",
"#(nop) CMD [sh -c echo $HOME]"
]
上面输出的是空字符串.
最后就是ENTRYPOINT了其实和上面的CMD很相似吧,只不过是ENTRYPOINT不会被docker run中的给的命令参数覆盖. 当然还有就是CMD的第二种写法 向ENTRYPOINT提供参数:这种应用场景 CMD可以为ENTRYPOINT提供参数,ENTRYPOINT本身也可以包含参数,但是你可以把那些可能需要变动的参数写到CMD 里而把那些不需要变动的参数写到ENTRYPOINT里面例如:
FROM ubuntu:14.10
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流