Dockerfile中RUNCMD以及ENTRYPOINT的区别

Dockerfile中的RUN,CMD,ENTRTPOINT三个指令均可以用来指明容器中所运行的指令,但这三者存在的细微的区别。

简单来说:

RUN

RUN指令一般用于在容器内安装软件包或者是执行其他的命令,如

CMD

CMD指令主要用来指明生成的Docker镜像在启动时的命令及参数,这个指令可以被docker run后面的命令所取代,比如下面这个Dockerfile文件

CMD指明了Docker镜像在运行时的输出一个”hello world”

但是如果在docker run后添加其他指令。那么CMD将直接被替换

ENTRYPOINT

ENTRYPOINT与CMD类似,区别在于ENTRYPOINT一定会被执行。如果一个Dockerfile中同时存在ENTRYPOINT和

CMD,CMD中的参数会被当做额外参数传给ENTRYPOINT。

通过docker run 来运行,CMD变成了ENTRYPOINT的参数:

但是如果指明docker run 的参数china,那么输出就会变为:

原本CMD中带的参数world被docker run中的china所替换,但ENTRYPOINT自带的hello依然正常输出

Shell与Exec格式

CMD,RUN,ENTRYPOINT可以用两种格式来传递命令和参数,Shell一般表示为指令+命令,如:

第一个大写的单词是Dockerfile的指令。后面跟的就是命令,可以拿到shell中单独执行

Exec格式可以表示为:指令+[“命令”,“命令参数1”,“命令参数2”,…],比如:

对于这两种格式来说,CMD和ENTRYPOINT最好使用Exec格式,命令和参数分开,层次性较强,而RUN则都可以。

注意:ENTRYPOINT的Shell格式和Exec格式差异很大。比如下面这个Shell格式的ENTRYPOINT

在运行所生成的容器时,仅会输出hello,而CMD带的”world”会被忽略。同样的docker run带的参数也同样会被忽略

文章知识点与官方知识档案匹配,可进一步学习相关知识云原生入门技能树首页概览8591 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年2月5日
下一篇 2021年2月5日

相关推荐