dockerfile配置参数(dockerfile中ENTRYPOINT与CMD的结合使用及区别)
dockerfile配置参数
dockerfile中ENTRYPOINT与CMD的结合使用及区别我们在上篇小作文[docker容器dockerfile详解]对中dockerfile有了比较全面的认识,我们也提到`ENTRYPOINT`和`CMD`都可以指定容器启动命令。因为这两个命令是掌握dockerfile编写的核心,所以这边还是单独拿出来再讲一讲。
一、写在前面我们在上篇小作文docker容器dockerfile详解对中dockerfile有了比较全面的认识,我们也提到ENTRYPOINT
和CMD
都可以指定容器启动命令。因为这两个命令是掌握dockerfile编写的核心,所以这边还是单独拿出来再讲一讲。
我们直接进入主题,CMD 与 ENTRYPOINT都是用于指定启动容器执行的命令,区别在于:
- 当docker run 命令中有参数时,守护进程会忽略CMD命令。
- 使用ENTRYPOINT指令不会忽略,并且会接收docker run 参数附加到命令行中。
为了使构建的容器可以正常启动,我们编写的dockerfile文件必须包含一个CMD或ENTRYPOINT指令。
三、CMD 与 ENTRYPOINT的结合使用1.CMD
CMD
指令有三种形式:
CMD ["executable","param1","param2"]
(exec形式,这是首选形式)CMD ["param1","param2"]
(作为ENTRYPOINT 的默认参数)CMD command param1 param2
(shell形式)
dockerfile文件中包含多个CMD时,只有最后一个被加载使用。
我们在dockerhub中搜索centos官方镜像,看一下的官方dockerfile文件。
基本上每一个官方镜像都会为我们提供各自版本的dockerfile链接,如下:
我们查看latest
标签的dockerfile
FROM scratch ADD centos-8-x86_64.tar.xz / LABEL org.label-schema.schema-version="1.0" org.label-schema.name="CentOS Base Image" org.label-schema.vendor="CentOS" org.label-schema.license="GPLv2" org.label-schema.build-date="20201204" CMD ["/bin/bash"]
只有四行,这就是构建一个latest
版本centos8.3.2011镜像的dockerfile全部内容。指定基镜像(这里从scratch这个空镜像开始构建),添加rootfs内容,打标签,通过CMD指定启动命令。
不止centos,其他debian、ubuntu、busybox等镜像都只需通过CMD指定启动命令。比如busybox更为简约:
FROM scratch ADD busybox.tar.xz / CMD ["sh"]
这种基础类、工具类镜像的构建我们只需要指定一个必要CMD来启动容器即可。但是我们编写一个dockerfile并不是为了启动容器而编写,大多数时候我们要在容器运行我们的app,运行我们的服务。
当然通过CMD也可以启动,可是如此一来有一个缺陷,我们上面说到的CMD的启动命令会被docker run 参数代替。
我们有下面Dockerfile
[root@localhost dockerfiles]# cat Dockerfile FROM centos CMD ["/bin/top","-b"]
构建后,使用参数ps启动容器。
[root@localhost dockerfiles]# docker run -it centos_top:v1 ps PID TTY TIME CMD 1 pts/0 00:00:00 ps
可看看到启动容器后top -b
已经被替换为ps,并非实现参数的替换。显然这不是我们想要的。有没有什么办法既可以默认启动应用,又可以加载到docker run 参数?这就是接下来ENTRYPOINT与CMD的妙用。
2.ENTRYPOINT结合CMD
ENTRYPOINT
的exec和shell形式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
上面我们提到CMD ["param1","param2"]
形式可以作为ENTRYPOINT参数,同时ENTRYPOINT 指定的命令无法被docker run 参数取代。假如我们把CMD和ENTRYPOINT两个指令相结合,这样我们就可以通过CMD来接收docker run 参数,然后把参数传递给ENTRYPOINT执行。
我们以nginx官方dockerfile latest版本1.21为例
首先我们查看Dockerfile
,这里我们只关注启动命令,如下:
... COPY docker-entrypoint.sh / COPY 10-listen-on-ipv6-by-default.sh /docker-entrypoint.d COPY 20-envsubst-on-templates.sh /docker-entrypoint.d COPY 30-tune-worker-processes.sh /docker-entrypoint.d ENTRYPOINT ["/docker-entrypoint.sh"] EXPOSE 80 STOPSIGNAL SIGQUIT CMD ["nginx", "-g", "daemon off;"]
从上面我们可以看到,在启动nginx容器时首先运行docker-entrypoint.sh
脚本并把CMD命令中的参数nginx -g "daemon off;"
传递进来。即docker run不添加参数时启动容器相当于执行如下脚本与默认参数。
#docker-entrypoint.sh nginx -g "daemon off;"
当我们使用docker run 传入参数会怎样?
我传入nginx-debug
#docker run -dt nginx nginx-debug -g "daemon off;"
此时启动容器相当于执行如下脚本与参数
#docker-entrypoint.sh nginx-debug -g "daemon off;"
我们通过ps来看一下我们启动的容器
[root@localhost dockerfiles]# ps -ef|grep nginx root 6327 6306 0 Aug12 pts/0 00:00:00 nginx: master process nginx -g daemon off; 101 6384 6327 0 Aug12 pts/0 00:00:00 nginx: worker process 101 6385 6327 0 Aug12 pts/0 00:00:00 nginx: worker process root 16800 16780 3 12:51 pts/0 00:00:00 nginx: master process nginx-debug -g daemon off; 101 16857 16800 0 12:51 pts/0 00:00:00 nginx: worker process 101 16858 16800 0 12:51 pts/0 00:00:00 nginx: worker process
显然我们两种参数nginx、nginx-debug的容器都启动成功!
也就是说我们通过ENTRYPOINT ["/docker-entrypoint.sh"]
指定的命令在启动时无论如何都会执行,并且可以接收到了docker run 的参数。
docker-entrypoint.sh是什么?docker-entrypoint.sh这是一个预处理脚本通常用来过滤命令行参数或者执行exec 来启动容器为1的进程。
通过ENTRYPOINT+CMD实现命令默认参数或接收docker run 参数是一种非常流行并且有用的dockerfile编写方式。
到此这篇关于dockerfile中ENTRYPOINT与CMD的结合的文章就介绍到这了,更多相关dockerfile中ENTRYPOINT与CMD内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
- 2022-01-25 00:54:18
- docker 命令上传镜像到镜像仓库(Docker 制作镜像Dockerfile和commit操作)
- docker目录映射不起作用(关于dockerfile build过程中报/bin/sh: pip: command not found的解决方法)
- dockerfile启动容器服务(docker文件存放路径, 获取容器启动命令操作)
- docker如何加volume(Dockerfile 中 VOLUME 与 docker -v 的区别说明)
- dockerfile构建镜像两种方式(通过Dockerfile构建Docker镜像的方法步骤)
- 查看docker容器进程运行状态命令(docker容器内要启动两个进程时Dockerfile的实现代码)
- dockerfile深度解析(Dockerfile文本文件使用方法实例解析)
- dockerfile构建mysql镜像并初始化(docker-compose基于MySQL8部署项目的实现)
- idea生成dockerfile(idea集合docker实现镜像打包一键部署)
- dockerfile挂载目录(解决docker run中使用 ./ 相对路径挂载文件或目录失败的问题)
- dockerfile配置参数(dockerfile中ENTRYPOINT与CMD的结合使用及区别)
- dockerfile映射目录(Dockerfile中ENTRYPOINT 和 CMD的区别说明)
- dockerfile镜像介绍(使用Dockerfile构建docker镜像)
- dockerfile镜像案例(Dockerfile构建自定义镜像的实现)
- dockerfile 添加yum文件(使用YUM 安装 docker的方法步骤)
- 一课译词 放鸽子(一课译词放鸽子)
- 终于来了,淘宝更改账户名测试中,快去看看你能不能修改(淘宝更改账户名测试中)
- 淘宝支持账号名修改,网友 终于可以 重新做人 了(淘宝支持账号名修改)
- 盘点那些年让人称奇的年终奖 最后一个赢辣条毫无悬念(盘点那些年让人称奇的年终奖)
- 你还没有升职吗 他竟因为几套激励理论,升职了(你还没有升职吗)
- 某知名企业绩效管理体系及薪酬分配体系操作手册(某知名企业绩效管理体系及薪酬分配体系操作手册)
热门推荐
- html5清除浮动的方法(HTML5实现移动端点击翻牌功能)
- vuejs filter过滤器的使用(Vue过滤器filter实现及应用场景详解)
- 阿里云服务器总被攻击怎么办(香港云服务器遭遇恶意攻击怎么处理?)
- vue3中的setup的参数(Vue3中ref与reactive的详解与扩展)
- thinkphp5对接支付宝扫码支付(ThinkPHP框架下整合支付宝支付功能图文教程)
- 如何提高织梦dedecms的安全性(详解织梦DedeCMS幻灯片调用图片显示模糊的原因以及解决办法)
- nodejs怎么查看对象的全部属性(浅谈nodejs中创建cluster)
- sqlserver复制表结构及数据到新表(SQL SERVER 表与表之间 字段一对多sql语句写法)
- phpcurl请求能在日志里记录吗(php使用curl模拟多线程实现批处理功能示例)
- python起源详解(Python发展简史 Python来历)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9