RUN vs CMD vs ENTRYPOINT 对比详解

原创 浪子丶刘少  2019-06-01 09:30  阅读 1,654 次 评论 0 条 百度未收录

一、RUN、CMD 和 ENTRYPOINT

  1. RUN 执行命令并创建新的镜像层,RUN 经常用于安装软件包。
  2. CMD 设置容器启动后默认执行的命令及其参数,但 CMD 能够被 docker run 后面跟的命令行参数替换。
  3. ENTRYPOINT 配置容器启动时运行的命令。

二、Shell 和 Exec 格式

Shell 格式
<instruction> <command>
例:
RUN apt-get install python3
CMD echo "Hello world"
ENTRYPOINT echo "Hello world"

当指令执行时,shell 格式底层会调用 /bin/sh -c <command>
Exec 格式
<instruction> ["executable", "param1", "param2", ...]
例:
RUN ["apt-get", "install", "python3"]
CMD ["/bin/echo", "Hello world"]
ENTRYPOINT ["/bin/echo", "Hello world"]
实例对比
Shell 格式
..
ENV name Liu Shao
ENTRYPOINT echo "Hello, $name"
..
执行 docker run <image> 将输出:
Hello, Liu Shao

Exec 格式
..
ENV name Liu Shao
ENTRYPOINT ["/bin/echo", "Hello, $name"]
..
运行容器将输出:
Hello, $name
注:使用环境变量,如下修改
..
ENV name Cloud Man
ENTRYPOINT ["/bin/sh", "-c", "echo Hello, $name"]
..
运行容器将输出:
Hello, Liu Shao
使用推荐
CMD 和 ENTRYPOINT 推荐使用 Exec 格式,因为指令可读性更强,更容易理解。 RUN 则两种格式都可以。

三、RUN详解

RUN 指令通常用于安装应用和软件包。
RUN 在当前镜像的顶部执行命令,并通过创建新的镜像层。Dockerfile 中常常包含多个 RUN 指令。
RUN 的两种格式:
  1. Shell 格式:RUN
  2. Exec 格式:RUN ["executable", "param1", "param2"]
注:yum update 和 yum install 被放在一个 RUN 指令中执行,这样能够保证每次安装的是最新的包。如果 yum install 在单独的 RUN 中执行,则会使用 yum update 创建的镜像层,而这一层可能是很久以前缓存的。

四、CMD详解

CMD 指令允许用户指定容器的默认执行的命令。
注意:
  1. 如果 docker run 指定了其他命令,CMD 指定的默认命令将被忽略。
  2. 如果 Dockerfile 中有多个 CMD 指令,只有最后一个 CMD 有效
CMD 三种格式:
  1. Exec 格式:CMD ["executable","param1","param2"]
这是 CMD 的推荐格式。
  1. CMD ["param1","param2"] 为 ENTRYPOINT 提供额外的参数,此时ENTRYPOINT 必须使用 Exec 格式。
  2. Shell 格式:CMD command param1 param2

五、ENTRYPOINT详解

ENTRYPOINT 指令可让容器以应用程序或者服务的形式运行。
ENTRYPOINT 看上去与 CMD 很像,它们都可以指定要执行的命令及其参数。不同的地方在于 ENTRYPOINT 不会被忽略,一定会被执行,即使运行 docker run 时指定了其他命令。
ENTRYPOINT 两种格式:
  1. Exec 格式:ENTRYPOINT ["executable", "param1", "param2"] 这是ENTRYPOINT 的推荐格式。
  2. Shell 格式:ENTRYPOINT command param1 param2
ENTRYPOINT 两种格式对比:
Exec 格式 Exec 格式用于设置要执行的命令及其参数,同时可通过 CMD 提供额外的参数 ENTRYPOINT 中的参数始终会被使用,而 CMD 的额外参数可以在容器启动时动态替换掉。 Shell 格式 ENTRYPOINT 的 Shell 格式会忽略任何 CMD 或 docker run 提供的参数。

本文地址:https://www.ezliushao.com/200.html
加入我们:请加入刘少技术博客交流群:扫描二维码刘少技术博客的QQ交流群 | 浪子丶刘少 QQ:1150110267(注:微信暂停添加好友)
版权声明:本文为原创文章,版权归 浪子丶刘少 所有,欢迎分享本文,转载请保留出处!

发表评论


表情