本文详细介绍了Dockerfile中ENTRYPOINT和CMD的区别,说明其具有非常好的实用价值,期待对大家有所帮助。跟我回去看看。
在Docker的系统学习实例教程中,我们了解到使用Dockerfile构建Docker镜像是一种标准的方法,我们可以根据Dockerfile掌握镜像中安装的组件的详细内容。
Dockerfile一般由四部分组成:一是基本镜像;第二,镜像构建者的信息内容;第三,在构建镜像的整个过程中,向镜像层添加指令;第四,镜像启动容器时执行的程序流程。
本文涉及的ENTRYPOINT和CMD属于Dockerfile的最后一部分。这两条Dockerfile指令用于通知Docker在后台运行引导镜像时必须实现的程序流。两者略有不同。
下面,将从两者的区别及其协同应用的先进方法层面对两个指令进行详细说明。
CMD指令
CMD命令指定了容器在启动时必须 *** 作的流程流。一般来说,当一个容器由一个非常简单的方法启动时,dockerrun的应用程序会将主要参数发送给docker命令。
dockerrun-itimage/bin/bash
下面的/bin/bash实际上发送了主参数,告诉容器在启动时运行一个shell。这整个过程可以用CMD指令等效电路来代替。
CMD['/bin/bash']
因此,当这个CMD指令指定的指令存储在Dockerfile中时,启动容器可以避免参数传递。
docker运行图像
实际效果是一致的。
[root@MiWiFi-R3L-srv测试]#dockerrun-nametest-ittest_image
[root@3a1bb0c9e35c/]#
如果dockerfile在容器启动时已经指定了程序流,并且在dockerfile启动容器时应用了命令行参数,那么Dockerfile中的cmd指令将无效。
docker运行图像/bin/ps
发现容器启动后没有shell,只是复制了容器中的进程情况,掩盖了cmd指令的实际效果。
PIDTTYTIMECMD 1?00:00:00ps [root@MiWiFi-R3L-srvtest]#这时候就可以看出cmd的实际效果是被覆盖的。dockerfile中只有最后一条cmd指令是合理的,所以dockerfile中只写一条cmd指令。
入口点指令
ENTRYPOINT指令的实际效果和CMD很像,很容易混淆两个函数。区别很大,取决于应用方法。ENTRYPOINT指定的指令必须与docker运行启动容器相匹配,docker运行指令所遵循的内容作为ENTRYPOINT指令指定的运行命令的主参数。一般来说,ENTRYPOINT指定的linux指令不容易覆盖。
以nginx镜子为例,说明
首先构建一个nginx镜像,指定容器运行时实现的程序流是nginx。
FROMcentos MAINTAINERallocator RUNyuminstall-ynginx RUNecho'helloworld'>/usr/share/nginx/html/index.html EXPOSE80 ENTRYPOINT["/usr/sbin/nginx"]然后启动镜像
dockerrun-nametest-p5000:80-ittest_nginx-g"守护程序关闭"
后两个作为参数传递给nginx启动程序执行。此时nginx作为前台接收程序执行,是一个web服务器,可以根据与外界关联的端口号和电脑浏览器看到helloworld。
同时使用它们的技巧
知道了两者的区别,我们就可以利用它们的特性,构建一个默认设置的镜像来启动正在运行的程序流程,在dockerrun启动时应用人为因素来指定启动程序执行的主要参数。
举个例子吧。ENTRYPOINT用于指定启动nginx程序流程的启动 *** 作,默认设置的主要 *** 作参数是辅助信息内容的显示信息。dockerfile的构造如下:
入口点["/usr/sbin/nginx"]
CMD["-h"]
当DockerRun-nametest-ittest_nginx的应用没有传输所有主参数时,启动容器会使用cmd命令之后的命令作为默认设置主参数,并复制nginx的帮助信息内容。此时cmd之后的内容不是详细的指令,只是主要参数。如果是详细的说明,会把ENTRYPOINT里的内容掩盖掉。
如果启动了应用dockerrun-nametest-ittest_nginx-g“daemonoff”,此时给出的主要运行参数会掩盖与CMD指令匹配的内容。这时候nginx会作为前台接待流程运行,作为web服务器应用,根据浏览器就可以看到helloworld。
填写专长:Docker-entrypoint.sh渠道文档写作方法
在docker的官网注册表(store.docker.com)中,现在流行的第三方应用都在自己的网页上显示dockerfile的连接,很多dockerfile的ENTRYPOINT指令都是那样写的["docker-entrypoint.sh"]。
本文内容是推广docker-entrypoint.sh独特的使用方法和设计逻辑
MySQL
变量检查
您编写的每个脚本都应该在文档的开头添加set-e。这句话告诉bash,如果所有句子的执行结果都不为真,就退出。这样做的好处是防止不准确性像稳定的利润一样增加,从而导致致命的不准确性,这在以前就应该解决了。如果想提高可读性,可以应用set-oerrexit,效果和set-e一样。
设置o管道故障
设计的主要目的和上面一样,就是我们期望在不正确的实现之后立即退出,不要再进一步实现。-opipefail的作用范围是管道,换句话说,Linux脚本制作中的管道,如果前面的指令很难实现,就要立即收回。
空球
在Linux*中使用通配符时?如果所有的文档都不匹配,不容易报告没有这样的文件或目录,但指令背后的主要参数被删除和实现。
if["${1:0:1}"='-'];然后…
这是一个有区别的句子。在官网文档中,前面一行已经注释:如果command以选项开头,则前置mysqld。
这个区分句是${1:0:1},意思是区分(启用脚本制作的第一个主参数),偏移0(无偏),取一个字符(取字符串数组的长度)。
如果你能分辨出脚本制作所遵循的主参数的第一个标识符是-中间横线,你会觉得后面所有的字符串数组都是mysqld的主启动参数。
上面的实际 *** 作类似于对Python的字符串数组进行切片。
set–mysqld"$@"
第一个主参数是-start后,实现了指令集-mysqld“$@”。应用set-的用法。set-将它后面的所有字符串数组(用空区分)存储到,,个独立变量中,其中新的$1
示例:bashdocker-entrypoint.sh-fxxx.conf
在这种情况下,set-mysqld"$@"-fxxx.conf中$@的值。
当执行set-mysqld"$@"指令时:
$1=mysqld $2=-f $3=xxx.conf $@=mysqld-fxxx.conf可以看到,在实现docker-entrypoint.sh脚本时,在后面添加了-x模式的主要参数后,基本上在$@的原始值之上更改了$@的值,在前面添加了mysqld指令。
执行“$@”
基本上,在每个docker-entrypoint.sh脚本的最后一行,所有的exec“$@”指令都被实现。
此说明的实际含义取决于您对映像的预期启用状态。当应用图像的人具体实现你没想到的可执行命令时,他可能会来到脚本的最后一行,实现客户新的可执行命令。
状态解析
上面马上提到的最后一行脚本,在之前的脚本中,你必须充分考虑到你自己的脚本很可能被启用的情况。或者以MySQL官网的dockerfile为例,他可以区分以下几种情况:
开头是,我认为这是主要参数。
它以mysqld开始,客户id为0(根客户)
就是mysqld刚开始的情况。
在区分您自己使用的所有启用的形状之后,您应该最后添加exec“$@”指令。
${mysql[@]}
Shell中的数组,立即实现${mysql[@]}将这个数组实现为一个可执行文件。
➜/tmpmysql=(mysql--protocol=socket-uroot-hlocalhost--socket="${SOCKET}") ➜/tmpecho${mysql[1]} mysql ➜/tmpecho${mysql[2]} --protocol=socket ➜/tmpecho${mysql[3]} -uroot ➜/tmpecho${mysql[4]} -hlocalhost ➜/tmpecho${mysql[@]} mysql--protocol=socket-uroot-hlocalhost--socket= execgosumysql“$BASH_SOURCE”“$@”这里的gosu指令是Linux中sudo指令的轻量级“替代品”
Gosu是golang语言开发设计的专用工具,用来代替shell中的sudo指令。su和sudo指令都有一些缺点,主要是会造成不确定性,还有共享信号量的问题。如果只是为了更好的应用特殊的客户 *** 作规程,应用su或者sudo显得太过沉重,于是gosu就应运而生了。
Gosu马上利用libcontainer的基本原理启动容器中的应用软件,应用/etc/passwd解决应用软件。gosu先找到指定的客户或用户组,然后切换到那个客户或用户组。接下来,应用执行程序启动应用软件。在这里,gosu完成了它的工作,它不容易参与申报周期时间背后的应用软件。应用这种方法可以避免gosu解决TTY和共享信号量,并立即将这两项任务交给应用软件。
上面Dockerfile中ENTRYPOINT和CMD的区别,表示是我分享给大家的全部内容。期待给你一个参考,也期待你的申请。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)