dockerexec详解(docker中的run/cmd/entrypoint的区别详解)
dockerexec详解
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中的run/cmd/entrypoint的区别详解的文章就介绍到这了,更多相关docker run/cmd/entrypoint内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
- centosdocker镜像安装mysql(linux下利用Docker安装mysql的步骤)
- netcorelinux后台运作(Linux系统Docker 部署 ASP.NET Core应用的流程分析)
- docker显示出错应用图标怎么处理(docker 命令报异常permission denied的解决方案)
- docker容器内部怎么查看id(docker容器中无法获取宿主机hostname的解决方案)
- docker 查看容器下进程(docker 查看容器日志命令的实现)
- springcloud部署docker(Spring Cloud中使用jib进行docker部署的步骤详解)
- 如何使用docker启动tomcat(Docker容器上用DockerFile部署多个tomcat服务的步骤)
- docker脚本指定linux(在docker中执行linux shell命令的操作)
- docker的解剖(再见 Docker如何5分钟转型 containerd)
- docker安装与使用教程(5分钟安装docker详细步骤)
- docker中国加速镜像怎么设置(Docker 安装及配置镜像加速的实现)
- spring boot docker部署(docker部署springboot和vue项目的实现步骤)
- 部署docker需要什么配置(解决Docker必须使用sudo操作的问题)
- rocketmq安装linux(docker安装rocketMQ教程最详细)
- docker搭建私有dns域名解析(docker内网搭建dns使用域名访问替代ip:port的操作)
- docker 镜像mysql(解决docker拉取mysql镜像太慢的情况)
- 佛肚竹盆景的养护之道(佛肚竹盆景的养护之道)
- 包水饺(包水饺手法怎么包视频)
- 越南河粉(越南河粉来自哪里)
- 按这几方面养护佛肚竹盆景,保证枝叶繁茂,造型优美(按这几方面养护佛肚竹盆景)
- 冰岛旅游攻略(冰岛旅游攻略及花费八日游)
- 寒假旅游攻略(成都寒假旅游攻略)
热门推荐
- vue切换图片效果(Vue.js实现图片切换功能)
- vue可以使用jsx语法吗(vue中正确使用jsx语法的姿势分享)
- php守护进程(什么是PHP7中的孤儿进程与僵尸进程)
- js怎么做一个计时器(JavaScript实现简单计时器)
- chrome调试js
- iis的安装与配置图解教程(windows+IIS6安装及搭建网站服务器环境教程)
- wx小程序请求封装(小程序wx.getUserProfile接口的具体使用)
- 阿里云服务器ecs怎么设置(如何解决阿里云ECS服务器误开启了防火墙导致远程连接不上的问题)
- python 提取微信消息(python实现文件助手中查看微信撤回消息)
- 怎么用python做随机矩阵(python实现杨氏矩阵查找)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9