docker中的run/cmd/entrypoint的区别详解
Dockerfile中run、cmd和entrypoint都能够用于执行命令,下面是三者的主要用途:
run命令执行命令并创建新的镜像层,通常用于安装软件包 cmd命令设置容器启动后默认执行的命令及其参数,但CMD设置的命令能够被docker run命令后面的命令行参数替换 entrypoint配置容器启动时的执行命令,不会被忽略,一定会被执行,即使运行
docker run时指定了其他命令。
Shell格式和Exec格式运行命令
我们可以用下面两种格式指定run、cmd和entrypoint要运行的命令:
Shell格式: 。例如:yum install -y wget Exec格式: [“executable”, “param1”, “param2”, …]。例如: [“yum”, “install”, “-y”, “wget”]cmd和entrypoint推荐使用exec格式,因为指令的可读性更强,更容易理解,而run则两种格式都可以。
Exec格式的坑
dockerfile的内容如下:
env name morris entrypoint ["echo", "$name"]
这种写法只会打印出$name,不会进行变量的替换,原因是它只是在执行echo命令,并不是执行shell。意思是说,我们不是在shell里执行echo,只是单纯的执行echo,所以不会替换变量。
想要改成可执行的shell,需要改写成以下形式
env name morris entrypoint ["/bin/bash", "-c", "echo $name"]
run命令
run指令通常用于安装应用和软件包。run在当前镜像的顶部执行命令,并通过创建新的镜像层。Dockerfile中常常包含多个run指令。下面是一个例子:
run yum update && yum install -y \ bzr \ cvs \ git \ mercurial \ subversion
yum update和yum install被放在一个run指令中执行,这样能够保证每次安装的是最新的包。如果yum install在单独的run中执行,则会使用yum update创建的镜像层,而这一层可能是很久以前缓存的。
cmd命令
cmd指令允许用户指定容器的默认执行的命令。此命令会在容器启动且docker run没有指定其他命令时运行。下面是一个例子:
cmd echo "Hello world"
运行容器docker run -it [image]将输出:
Hello world
但当后面加上一个命令,比如docker run -it [image] echo hi,cmd会被忽略掉,命令echo hi将被执行:
hi
如果存在多个cmd命令,则只会执行最后一个cmd命令。
entrypoint命令
entrypoint的exec格式用于设置容器启动时要执行的命令及其参数,同时可通过cmd命令或者命令行参数提供额外的参数。entrypoint中的参数始终会被使用,这是与cmd命令不同的一点。下面是一个例子:
entrypoint ["echo", "Hello"]
当容器通过docker run -it [image]启动时,输出为:
Hello
而如果通过docker run -it [image] morris启动,则输出为:
Hello morris
再来看一个例子,Dockerfile为:
entrypoint ["echo", "Hello"] cmd ["world"]
当容器通过docker run -it [image]启动时,输出为:
Hello world
而如果通过docker run -it [image] morris启动时,输出为:
Hello morris
entrypoint中的参数始终会被使用,而cmd的额外参数可以在容器启动时动态替换掉。
同样的,如果存在多个entrypoint命令,则只会执行最后一个entrypoint命令。
总结
使用run指令安装应用和软件包,构建镜像。 如果Docker镜像的用途是运行应用程序或服务,比如运行一个MySQL,应该优先使用Exec格式的entrypoint指令。cmd可为entrypoint提供额外的默认参数,同时可利用docker run命令行替换默认参数。 如果想为容器设置默认的启动命令,可使用cmd指令。用户可在docker run命令行中替换此默认命令。上一篇:使用Docker Compose部快速署ELK(亲测有效)
栏 目:其它服务器
本文标题:docker中的run/cmd/entrypoint的区别详解
本文地址:https://zz.feitang.co/server/35446.html
您可能感兴趣的文章
- 01-12Docker部署rabbitmq遇到的两个问题
- 01-12最新虚拟机VMware 14安装教程
- 01-12使用docker compose安装harbor私有仓库的详细教程
- 01-12Windows下Docker安装各种软件的详细过程
- 01-12seata docker 高可用部署的详细介绍
- 01-12浅谈Tomcat多层容器的设计
- 01-12Gogs+Jenkins+Docker 自动化部署.NetCore的方法步骤
- 01-12解决vscode docker插件docker.socket权限问题
- 01-12Docker中运行PostgreSQL并推荐几款连接工具
- 01-12Docker核心原理之 Cgroup详解


阅读排行
推荐教程
- 12-07一文教你怎么选择Tomcat对应的JDK版本
- 12-23linux中ftp无法访问怎么办
- 12-11docker存储目录迁移示例教程
- 12-10docker start启动容器后仍然exit状态的解决
- 12-10Linux下如何安装Logstash
- 12-05Docker安装Jenkins全过程
- 01-05Shell脚本去重的几种方法实例
- 12-22kvm虚拟机配置NAT端口转发的实现方法
- 12-19Zabbix SAML SSO 登录绕过漏洞的操作流程
- 12-15Docker-Compose搭建Spark集群的实现方法




