文章目录

  • Shell与Exec格式
  • RUN
  • CMD
  • ENTRYPOINT
  • 三者的应用场景


Shell与Exec格式

  • 我们可以通过两种方式来指定RUN CMD ENTRYPOINT要运行的命令:一种是Shell,一种是Exec。两者上还是有一些细微的区别。
  1. Shell格式:
<instruction> <command>
  • 当执行指令时,shell格式底层会调用/bin/bash -c [command]
  1. Exec格式:
<instruction> [“executable”,”para1”,”para2”,......]
  • 当指令执行时,会直接调用[command],不会被shell所解析

Tips:CMD和ENTRYPOINT推荐使用Exec格式,这样做可以提高指令的可读性,更容易理解。RUN则两种格式都可以。

RUN

  • RUN指令通常用于安装应用及软件包
  • RUN在当前镜像的顶部执行命令,并创建新的镜像层。Dockerfile常常包括多个RUN
  • RUN的两种格式:
  1. Shell格式:RUN <command>
  2. Exec格式:RUN [“executable”,”para1”,”para2”,......]

CMD

  • CMD指令允许用户指定容器的默认执行命令
  • 此命令会在容器启动且docker run没有指定其他命令时执行
    ·如果docker run指定了其他命令,CMD指定的默认命令将被忽略
    ·如果Dockerfile中有多个CMD指令,只有最后一个会生效
  • CMD的三种格式:
  1. Shell格式:CMD <command> <para1> <para2>
  2. Exec格式:CMD [“executable”,”para1”,”para2”,......]CMD [“para1”,”para2”]为ENTRYPOINT提供额外参数,此时的ENTRYPOINT必须使用Exec格式

ENTRYPOINT

  • ENTRYPOINT指令可让容器以程序或者服务的形式运行
  • ENTRYPOINT与CMD很像,它们都可以指定要执行的命令及参数,不同在于ENTRYPOINT不会被忽略,一定会被执行,即使运行docker run时指定了其他命令。
  • ENTRYPOINT的两种格式:
  1. Exec格式:ENTRYPOINT [“executable”,”para1”,”para2”] (推荐格式)
    用于设置要执行的命令及参数,同时通过CMD提供额外的参数,ENTRYPOINT中的参数始终会被使用,CMD额外参数会在docker run时被动态替换掉。
  2. Shell格式:ENTRYPOINT command para1 para2 忽略所有CMD或docker run提供的参数

三者的应用场景

  1. 使用RUN指令安装应用和软件包,构建镜像。
  2. 如果docker镜像的用途是运行应用程序和服务,比如MySQL,应该使用Exec格式的ENTRYPOINT指令。CMD可以为其提供额外的默认参数,同时利用docker run命令替换默认参数。
  3. 如果想为容器设置默认的启动命令,可使用CMD指令。可使用CMD指令。用户可以在docker run命令行中替换此默认命令。