首先,CMD和ENTRYPOINT都可指定运行容器要执行的命令,但是Dockerfile中的CMD指令会被 docker run后的参数覆盖掉。
比如,很多image的Dockerfile中在最后都会有(比如tomcat)
...
EXPOSE 8080
CMD ["catalina.sh", "run"]
正常情况下,我们要运行这个image,只需要执行
docker run ImageName:tag
但是,如果我们想运行这个image后,进入容器,并列出容器根目录的文件/夹情况呢?我们可能会执行
docker run -it ImageName:tag ls -l
然后发现,容器并没有启动!原因就在于ls -l 命令覆盖掉了CMD["catalina.sh","run"].
然而,ENTRYPOINT命令则不会,它既能启动容器,还能执行ls -l命令。
网友评论