Dockerfile RUN 、 CMD 、 ENTRYPOINT区别

0 前言

运行命令的形式有两种:Shell格式和Exec格式运行命令
RUN两种都可以
CMD和ENTRYPOINT推荐使用Exec

Shell格式:<instruction> <command>。例如:apt-get install python3
Exec格式:<instruction> ["executable", "param1", "param2", ...]。例如: ["apt-get", "install", "python3"]

1 RUN

RUN指令允许您安装应用程序和程序包。它在当前镜像之上执行任何命令,并通过提交结果来创建新层。通常,您会在Dockerfile中找到多个RUN指令。

RUN apt-get update && apt-get install -y \
  bzr \
  cvs \
  git \
  mercurial \
  subversion

注意:apt-get update和apt-get install在单个RUN指令中执行。这样做是为了确保安装最新的软件包。如果apt-get install位于分开的RUN指令中,那么它将重用apt-get update添加的层,这可能是很久以前创建的。建议多个指令用&&隔开在一个run中执行。

2 CMD

CMD指令允许您设置默认命令,该命令仅在您运行容器不指定命令时候运行。如果Docker容器使用命令运行,则将忽略默认命令。如果Dockerfile具有多个CMD指令,则忽略除最后一个CMD指令之外的所有指令。
如:
dockerfile中有如下语句

CMD echo "Hello world" 

容器运行时docker run -it
出现Hello world
但是,运行时如果增加了其他指令,如docker run -it /bin/bash,那么CMD执行 /bin/bash命令,则不会输出

3 ENTRYPOINT

ENTRYPOINT指令允许您配置将作为可执行文件运行的容器。它看起来类似于CMD,因为它还允许您使用参数指定命令。区别在于当Docker容器使用命令行参数运行时,ENTRYPOINT命令不会忽略参数

ENTRYPOINT 中的参数始终会被使用,而 CMD 的额外参数可以在容器启动时动态替换掉。
如:
dockerfile中有:

ENTRYPOINT ["/bin/echo", "Hello"]  
CMD ["world"]

ENTRYPOINT和CMD同时存在时, docker把CMD的命令拼接到ENTRYPOINT命令之后, 拼接后的命令才是最终执行的命令。
当容器运行docker run -it 时将输出 hello world
但是,如果容器运行带参数,如docker run -it John时,将输出hello john

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值