Docker7

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)

坑坑1:

在所写的CMD [] 方式的时候一定要注意CMD 和[]之间是要空格隔开的,否则build就会出错.

坑坑2:

在写下面格式CMD时候:

坑坑3:

之前一直认为CMD中命令只会被run后面同样的命令覆盖,其实不是这样的,而是都是可以替代的.

坑坑4:

通过查看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": [
            "/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"]  

欢迎一起交流学习

在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流

Thx

Author