CMD和ENTRYPOINT同样作为容器启动时执行的命令,区别有以下几点:
CMD的命令会被 docker run 的命令覆盖而ENTRYPOINT不会
如使用CMD ["/bin/bash"]或ENTRYPOINT ["/bin/bash"]后,再使用docker run -ti image启动容器,它会自动进入容器内部的交互终端,如同使用
docker run -ti image /bin/bash。
但是如果启动镜像的命令为docker run -ti image /bin/ps,使用CMD后面的命令就会被覆盖转而执行bin/ps命令,而ENTRYPOINT的则不会,而是会把docker run 后面的命令当做ENTRYPOINT执行命令的参数。
以下例子比较容易理解
Dockerfile中为:
...
ENTRYPOINT ["/user/sbin/nginx"]
然后通过启动build之后的容器:
docker run -ti image -g "daemon off"
此时-g "daemon off"会被当成参数传递给ENTRYPOINT,最终的命令变成了:
/user/sbin/nginx -g "daemon off"
CMD和ENTRYPOINT都存在时
CMD和ENTRYPOINT都存在时,CMD的指令变成了ENTRYPOINT的参数,并且此CMD提供的参数会被 docker run 后面的命令覆盖,如:
...
ENTRYPOINT ["echo","hello","i am"]
CMD ["docker"]
之后启动构建之后的容器:
使用docker run -ti image
输出“hello i am docker”
使用docker run -ti image world
输出“hello i am world”