Docker中的run、cmd、entrypoint的区别详解

小柒助手 Docker评论1,78810字数 933阅读3分6秒阅读模式

Dockerfile中runcmd和entrypoint都能够用于执行命令,下面是三者的主要用途:

  • run命令执行命令并创建新的镜像层,通常用于安装软件包
  • cmd命令设置容器启动后默认执行的命令及其参数,但CMD设置的命令能够被docker run命令后面的命令行参数替换
  • entrypoint配置容器启动时的执行命令,不会被忽略,一定会被执行,即使运行docker run时指定了其他命令。

Shell格式和Exec格式运行命令

我们可以用下面两种格式指定run、cmd和entrypoint要运行的命令:
文章源自小柒网-https://www.yangxingzhen.cn/8032.html

Shell格式:例如:yum install -y vim
文章源自小柒网-https://www.yangxingzhen.cn/8032.html

Exec格式:例如:["yum","install","-y","vim"]
文章源自小柒网-https://www.yangxingzhen.cn/8032.html

cmd和entrypoint推荐使用exec格式,因为指令的可读性更强,更容易理解,而run则两种格式都可以。
文章源自小柒网-https://www.yangxingzhen.cn/8032.html

dockerfile的内容如下:
文章源自小柒网-https://www.yangxingzhen.cn/8032.html

env name test
entrypoint ["echo","$name"]

这种写法只会打印出$name,不会进行变量的替换,原因是它只是在执行echo命令,并不是执行shell。意思是说,我们不是在shell里执行echo,只是单纯的执行echo,所以不会替换变量。
文章源自小柒网-https://www.yangxingzhen.cn/8032.html

想要改成可执行的shell,需要改写成以下形式
文章源自小柒网-https://www.yangxingzhen.cn/8032.html

env name test
entrypoint ["/bin/bash","-c","echo $name"]

run命令

run指令通常用于安装应用和软件包。run在当前镜像的顶部执行命令,并通过创建新的镜像层。Dockerfile中常常包含多个run指令。下面是一个例子:文章源自小柒网-https://www.yangxingzhen.cn/8032.html

from centos
run yum -y update && yum -y install wget vim

yum update和yum install被放在一个run指令中执行,这样能够保证每次安装的是最新的包。如果yum install在单独的run中执行,则会使用yum update创建的镜像层,而这一层可能是很久以前缓存的。
文章源自小柒网-https://www.yangxingzhen.cn/8032.html

cmd命令

cmd指令允许用户指定容器的默认执行的命令。此命令会在容器启动且docker run没有指定其他命令时运行。下面是一个例子:文章源自小柒网-https://www.yangxingzhen.cn/8032.html

cmd echo "Hello world"

运行容器docker run -it [image]将输出:

Hello world

但当后面加上一个命令,比如docker run -it [image] echo Hello,cmd会被忽略掉,命令echo Hello将被执行:

Hello

如果存在多个cmd命令,则只会执行最后一个cmd命令。

entrypoint命令

entrypoint的exec格式用于设置容器启动时要执行的命令及其参数,同时可通过cmd命令或者命令行参数提供额外的参数。entrypoint中的参数始终会被使用,这是与cmd命令不同的一点。下面是一个例子:

entrypoint ["echo","Hello"]

当容器通过docker run -it [image]启动时,输出为:

Hello

而如果通过docker run -it [image] Test启动,则输出为:

Hello Test

再来看一个例子,Dockerfile为:

entrypoint ["echo","Hello"]
cmd ["world"]

当容器通过docker run -it [image]启动时,输出为:

Hello world

而如果通过docker run -it [image] Test启动时,输出为:

Hello Test

entrypoint中的参数始终会被使用,而cmd的额外参数可以在容器启动时动态替换掉。

同样的,如果存在多个entrypoint命令,则只会执行最后一个entrypoint命令。

总结

使用run指令安装应用和软件包,构建镜像。

如果Docker镜像的用途是运行应用程序或服务,比如运行一个MySQL,应该优先使用Exec格式的entrypoint指令。cmd可为entrypoint提供额外的默认参数,同时可利用docker run命令行替换默认参数。

如果想为容器设置默认的启动命令,可使用cmd指令。用户可在docker run命令行中替换此默认命令。

若文章图片、下载链接等信息出错,请在评论区留言反馈,博主将第一时间更新!如本文“对您有用”,欢迎随意打赏,谢谢!

继续阅读
Wechat
微信扫一扫,加我!
weinxin
我的微信
微信号已复制
微信公众号
微信扫一扫,关注我!
weinxin
我的公众号
公众号已复制
Docker最后更新:2022-11-25
小柒助手
  • 本文由 小柒助手 发表于 2022年5月20日 14:16:52
  • 声明:本站所有文章,如无特殊说明或标注,本站文章均为原创。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。转载请务必保留本文链接:https://www.yangxingzhen.cn/8032.html
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

拖动滑块以完成验证