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中为:
然后通过启动build之后的容器:
此时-g "daemon off"会被当成参数传递给ENTRYPOINT,最终的命令变成了:
CMD和ENTRYPOINT都存在时
CMD和ENTRYPOINT都存在时,CMD的指令变成了ENTRYPOINT的参数,并且此CMD提供的参数会被 docker run 后面的命令覆盖,如:
之后启动构建之后的容器: