Dockerfile里指定执行命令用ENTRYPOING和用CMD有何不同?

 潇洒D-An_na 发布于 2022-10-25 09:12

如题,我一般是用CMD来指定的,比如:

FROM thelanddownunder
MAINTAINER ProgrammingLife

CMD ["apt-get install htop"]

但是看一些Dockerfile里也有用ENTRYPOINT来指定的,就是把上面的CMD换成ENTRYPOINT,后面好像也是指定一些命令的:

FROM thelanddownunder
MAINTAINER ProgrammingLife

ENTRYPOINT ["apt-get install htop"]

请问这两种方法有什么不一样的吗?另外,还有用RUN来指定命令的,语法和上面两种又不太一样,比如这样:

FROM thelanddownunder
MAINTAINER ProgrammingLife

RUN apt-get install htop
ENTRYPOINT ["apt-get install vim"]
2 个回答
  • 在Dockerfile文件中,如果存在ENTRYPOINT和CMD,那么CMD就是ENTRYPOINT的参数,如果没有ENTRYPOINT,则CMD就是默认执行指令

    2022-10-26 14:41 回答
  • 运行时机不太一样。

    RUN是在Build时运行的,先于CMD和ENTRYPOINT。Build完成了,RUN也运行完成后,再运行CMD或者ENTRYPOINT。

    ENTRYPOINT和CMD的不同点在于执行docker run时参数传递方式,CMD指定的命令可以被docker run传递的命令覆盖,例如,如果用CMD指定:

    ...
    CMD ["echo"]
    

    然后运行

    docker run CONTAINER_NAME echo foo
    

    那么CMD里指定的echo会被新指定的echo覆盖,所以最终相当于运行echo foo,所以最终打印出的结果就是:

    foo
    

    而ENTRYPOINT会把容器名后面的所有内容都当成参数传递给其指定的命令(不会对命令覆盖),比如:

    ...
    ENTRYPOINT ["echo"]
    

    然后运行

    docker run CONTAINER_NAME echo foo
    

    则CONTAINER_NAME后面的echo foo都作为参数传递给ENTRYPOING里指定的echo命令了,所以相当于执行了

    echo "echo foo"
    

    最终打印出的结果就是:

    echo foo
    

    另外,在Dockerfile中,ENTRYPOINT指定的参数比运行docker run时指定的参数更靠前,比如:

    ...
    ENTRYPOINT ["echo", "foo"]
    

    执行

    docker run CONTAINER_NAME bar
    

    相当于执行了:

    echo foo bar
    

    打印出的结果就是:

    foo bar
    

    Dockerfile中只能指定一个ENTRYPOINT,如果指定了很多,只有最后一个有效。

    执行docker run命令时,也可以添加-entrypoint参数,会把指定的参数继续传递给ENTRYPOINT,例如:

    ...
    ENTRYPOINT ["echo","foo"]
    

    然后执行:

    docker run CONTAINER_NAME bar #注意没有echo
    

    那么,就相当于执行了echo foo bar,最终结果就是

    foo bar
    

    我在dockboard.org上翻译了一篇《15 Docker Tips in 15 Minutes》,其中有讲到RUN、CMD和ENTRYPOINT的不同,你可以参考一下。

    另外有一个Docker Quicktips系列,里面有一篇也是讲ENTRYPIONT的,你可以看一下,连接在这里:
    http://www.tech-d.net/2014/01/27/docker-quicktip-1-entrypoint/

    这个系列的文章翻译我们马上也会添加到dockboard.org的,敬请关注一下哈。

    另外这里有官方文档中对entrypoint的说明:http://docs.docker.io/en/latest/reference/builder/#entrypoint

    2022-10-26 14:41 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有