CMD在容器运行的时候提供一些命令及参数,用法如下:
-
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指定参数。(cmd指定参数)
第三种用法(shell form):是以”/bin/sh -c”的方法执行的命令。(执行shell命令)
如你指定:
CMD [“/bin/echo”, “this is a echo test ”]
build后运行(假设镜像名为ec):
docker run ec
就会输出:
this is a echo test
是不是感觉很像开机启动项,你可以暂时这样理解。
注意点:
docker run
命令如果指定了参数会把CMD里的参数覆盖: (这里说明一下,如:docker run -it ubuntu /bin/bash 命令的参数是指/bin/bash 而非 -it ,-it
只是docker 的参数,而不是容器的参数,以下所说参数均如此。)
同样是上面的ec镜像启动:
docker run ec /bin/bash
就不会输出: 因为CMD命令被”/bin/bash”覆盖了。
this is a echo test
- ENTRYPOINT 也用于定义容器启动时要执行的命令,但不像 CMD,它的值不会被 Dockerfile 中的后续指令覆盖,只能在运行容器时添加参数来覆盖它。也就是说,ENTRYPOINT 设置的命令一般是容器镜像所要执行的主要命令,CMD 则是选项和参数。
换句话说,CMD 是为 ENTRYPOINT 提供默认选项,ENTRYPOINT 则是容器镜像中主要执行的命令。在 Dockerfile 中定义 ENTRYPOINT 可以使您的镜像更像一个可执行文件,而在运行容器时传递参数可以以更灵活的方式执行此命令。