文章目录
- Shell与Exec格式
- RUN
- CMD
- ENTRYPOINT
- 三者的应用场景
Shell与Exec格式
- 我们可以通过两种方式来指定RUN CMD ENTRYPOINT要运行的命令:一种是Shell,一种是Exec。两者上还是有一些细微的区别。
- Shell格式:
<instruction> <command>
- 当执行指令时,shell格式底层会调用
/bin/bash -c [command]
- Exec格式:
<instruction> [“executable”,”para1”,”para2”,......]
- 当指令执行时,会直接调用[command],不会被shell所解析
Tips:CMD和ENTRYPOINT推荐使用Exec格式,这样做可以提高指令的可读性,更容易理解。RUN则两种格式都可以。
RUN
- RUN指令通常用于安装应用及软件包
- RUN在当前镜像的顶部执行命令,并创建新的镜像层。Dockerfile常常包括多个RUN
- RUN的两种格式:
- Shell格式:
RUN <command>
- Exec格式:
RUN [“executable”,”para1”,”para2”,......]
CMD
- CMD指令允许用户指定容器的默认执行命令
- 此命令会在容器启动且docker run没有指定其他命令时执行
·如果docker run指定了其他命令,CMD指定的默认命令将被忽略
·如果Dockerfile中有多个CMD指令,只有最后一个会生效 - CMD的三种格式:
- Shell格式:
CMD <command> <para1> <para2>
- Exec格式:
CMD [“executable”,”para1”,”para2”,......]
CMD [“para1”,”para2”]为ENTRYPOINT提供额外参数,此时的ENTRYPOINT必须使用Exec格式
ENTRYPOINT
- ENTRYPOINT指令可让容器以程序或者服务的形式运行
- ENTRYPOINT与CMD很像,它们都可以指定要执行的命令及参数,不同在于ENTRYPOINT不会被忽略,一定会被执行,即使运行docker run时指定了其他命令。
- ENTRYPOINT的两种格式:
- Exec格式:
ENTRYPOINT [“executable”,”para1”,”para2”]
(推荐格式)
用于设置要执行的命令及参数,同时通过CMD提供额外的参数,ENTRYPOINT中的参数始终会被使用,CMD额外参数会在docker run时被动态替换掉。 - Shell格式:
ENTRYPOINT command para1 para2
忽略所有CMD或docker run提供的参数
三者的应用场景
- 使用RUN指令安装应用和软件包,构建镜像。
- 如果docker镜像的用途是运行应用程序和服务,比如MySQL,应该使用Exec格式的ENTRYPOINT指令。CMD可以为其提供额外的默认参数,同时利用docker run命令替换默认参数。
- 如果想为容器设置默认的启动命令,可使用CMD指令。可使用CMD指令。用户可以在docker run命令行中替换此默认命令。