dockerfile cmd enterpoint,docker run cmd entrypoint的区别,Dockerfile中ENTRYPOINT 和 CMD的区别说明

dockerfile cmd enterpoint,docker run cmd entrypoint的区别,Dockerfile中ENTRYPOINT 和 CMD的区别说明

本文主要介绍Dockerfile中ENTRYPOINT和CMD的区别,有很好的参考价值。希望对你有帮助。来和边肖一起看看吧。

在Docker的系统学习教程中,我们学习了如何使用Dockerfile作为标准方式来构建Docker映像。根据Dockerfile,我们可以知道镜像中安装的组件的详细信息。

Dockerfile一般由四部分组成:第一,基本图像;第二,镜像构建者的信息;第三,在构建镜像的过程中向镜像层添加指令;第四,由映像启动容器时执行的程序。

本文涉及的ENTRYPOINT和CMD属于Dockerfile的最后一部分。这两个Dockerfile指令用于告诉Docker后台程序在开始镜像时需要执行哪些操作。两者略有不同。

下面将从两者的异同和两者联合使用的高级技巧来详细讲解这两个指令。

CMD 指令

CMD指令指定了容器启动时需要运行的程序。通常,使用docker run以最简单的方式启动容器会将参数传递给docker指令。

docker run -it image /bin/bash

下面的/bin/bash实际上是一个传递参数,告诉容器在启动时运行一个shell。这个过程可以等效地用CMD指令代替。

CMD ['/bin/bash']

因此,当Dockerfile中存在该CMD指令指定的命令时,启动容器无法传递参数。

docker运行图像

执行效果一致。

[root@MiWiFi-R3L-srv测试]# docker run-name test-it test _ image

[root@3a1bb0c9e35c /]#

如果在dockerfile中指定了容器启动时要运行的程序,并且在用dockerfile启动容器时使用了命令行参数,则Dockerfile中的cmd指令将无效。

docker运行图像/bin/ps

启动容器后没有shell,但是打印出当前容器中的进程状态,覆盖cmd指令的效果。

TTY时间指令

1 ?00:00:00 ps

[root@MiWiFi-R3L-srv测试]#

此时,您可以看到cmd效果被覆盖。docker文件中只有最后一条cmd指令是有效的,因此docker文件中只写一条cmd指令。

ENTRYPOINT 指令

ENTRYPOINT指令的效果和CMD很像,很容易混淆两者的功能。最大的区别在于使用的方式。ENTRYPOINT指定的命令需要与docker运行启动容器相匹配,docker运行指令后面的内容作为ENTRYPOINT指令指定的运行命令的参数。一般情况下,ENTRYPOINT指定的linux命令不会被覆盖。

以nginx镜子为例来说明。

首先构建一个nginx镜像,指定容器运行时执行的程序是nginx。

来自centos

维护者分配器

运行yum install -y nginx

运行echo ' hello world '/usr/share/nginx/html/index . html

暴露80

入口点['/usr/sbin/nginx']

然后启动镜像

docker run-name test-p 5000:80-it test _ nginx-g“守护程序关闭”

后两个作为参数传递给nginx启动程序运行。此时nginx作为前台程序运行,是一个web服务器。根据对外绑定的端口,可以正常通过浏览器看到hello world。

两者联合使用技巧

了解了两者的区别,我们就可以利用它们的特点,用默认的启动和运行程序构建一个镜像,支持docker run在启动时手动指定启动程序的参数。

比如说。使用ENTRYPOINT来指定在启动时运行启动nginx程序,并给定默认运行参数来显示帮助信息,dockerfile的构建如下:

入口点['/usr/sbin/nginx']

CMD ['-h']

在不传递任何参数的情况下使用docker run-name test-it test _ nginx时,启动容器会使用cmd指令后的命令作为默认参数来打印nginx的帮助信息。此时,cmd之后的内容并不是一个完整的指令,而是一个参数。如果它的内容是一个完整的指令,它将覆盖ENTRYPOINT中的内容。

如果用docker run-name test-it test _ nginx-g ' daemon off '来启动,那么给定的运行参数会覆盖CMD指令对应的内容,nginx会作为前台进程运行,作为web服务器使用。通过浏览器可以看到hello world。

补充知识:docker-entrypoint.sh 入口文件编写技巧

在docker的官方注册表(store.docker.com)中,流行的第三方应用都在自己的页面上提供了dockerfile的链接,很多dockerfile的ENTRYPOINT命令都是这样写的['docker-entrypoint.sh']。

本文讨论docker-entrypoint.sh在识字下的特殊用法和设计逻辑。

MySQL

集合-e

您编写的每个脚本都应该在文件开头添加set -e。该语句告诉bash,如果任何语句的执行结果不为真,就退出。这样做的好处是防止错误像滚雪球一样越滚越大,导致致命的错误,这个问题应该在之前就处理好了。如果想增加可读性,可以使用set -o errexit,它的功能与set-e相同。

设置o管道故障

设计目的同上,就是希望执行错误后立即退出,不要再向下执行。而-o pipefail的作用范围是管道,也就是说,Linux脚本中的管道,如果前面的命令出错了,要立即退出。

空球

在Linux *中使用通配符时?如果没有匹配的文件,它将不会被报告到没有这样的文件或目录,但是命令后面的参数将被删除并执行。

if[" $ { 1:0:1 } "='-'];然后…

这是一份判决书。在官方文档中,前面一行已经给出了注释:如果command以option开头,则前置mysqld。

这个判断语句是${1:0:1},意思是判断$1(调用脚本的第一个参数),偏移量0(无偏移量),取一个字符(字符串的长度)。

如果判断调用这个脚本所遵循的参数的第一个字符是-中间横线,那么后面所有的字符串都被视为mysqld的启动参数。

上面的操作类似于Python中的字符串切片。

setmysqld " $ @ "

在判断出第一个参数是上面-的开头后,立即执行命令集-mysqld' $ @ '。使用set-的用法。set-会把后面用空格隔开的所有字符串依次存储到$1、$2和$3变量中,其中新的$ @就是set-之后的所有内容。

示例:bash docker-entry point . sh-fxxx . conf

在这种情况下,set-mysqld' $ @ '中$ @的值是-fxxx.conf。

执行命令集-mysqld' $ @ '后:

$1=mysqld

$2=-f

$3=xxx.conf

$@=mysqld -f xxx.conf

可以看到,在执行docker-entrypoint.sh脚本时,添加了-x形式的参数后,@的值发生了变化。在$ @原值的基础上,前面加了mysqld命令。

执行“$@”

几乎每个docker-entrypoint.sh脚本的最后一行都执行exec '$@ '命令。

该命令的意义在于,您已经预料到了映像的调用情况。当图像的实际用户执行你没有预料到的可执行命令时,他会转到脚本的最后一行执行用户新的可执行命令。

情况判断

它直接说到了剧本的最后一行。在之前的脚本中,你需要充分考虑自己的脚本可能被调用的情况。或者拿MySQL的官方dockerfile来说,他判断以下几种情况:

它以-开头,被认为是一个参数。

它以mysqld开头,用户id为0 (root用户)

最开始是mysqld的情况。

在判断了自己应用的所有调用形式后,最后应该在底部加上exec '$@ '命令。

${mysql[@]}

Shell中的数组,直接执行${mysql[@]}会将这个数组作为可执行程序执行。

/tmp MySQL=(MySQL-protocol=SOCKET-u root-hlocalhost-SOCKET=' $ { SOCKET } ')

/tmp echo ${mysql[1]}

关系型数据库

/tmp echo ${mysql[2]}

-协议=套接字

/tmp echo ${mysql[3]}

-乌鲁特

/tmp echo ${mysql[4]}

-hlocalhost

/tmp echo ${mysql[@]}

MySQL-protocol=socket-u root-hlocalhost-socket=

exec gosu mysql "$BASH_SOURCE" "$@ "

这里的gosu命令是Linux中sudo命令的轻量级“替代品”。

Gosu是golang语言开发的工具,用来代替shell中的sudo命令。su和sudo命令有一些缺陷,主要是造成TTY不确定,转发信号量也有问题。单纯用su或sudo运行特定用户的程序太沉重,于是gosu应运而生。

Gosu直接借用libcontainer在容器中启动应用的原理,使用/etc/passwd处理应用。gosu首先找出指定的用户或用户组,然后切换到那个用户或用户组。接下来,它用exec启动应用程序。到目前为止,gosu已经完成了它的工作,它不会参与申请后面的申报周期。通过这种方式,gosu可以避免处理TTY和转发信号量的问题,并将这两项任务直接留给应用程序。

以上Dockerfile中关于ENTRYPOINT和CMD区别的描述就是边肖分享的全部内容。希望能给你一个参考,多多支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • swf upload,fileupload控件上传文件
  • swf upload,fileupload控件上传文件,文件上传插件SWFUpload的使用指南
  • fileupload控件上传图片,fileupload实现多文件上传
  • fileupload控件上传图片,fileupload实现多文件上传,使用fileupload组件实现文件上传功能
  • filereader blob,js下载文件到本地 blob
  • filereader blob,js下载文件到本地 blob,js利用FileReader读取本地文件或者blob方式
  • fileitem获取文件名,fileitem.write
  • fileitem获取文件名,fileitem.write,浅谈FileItem类的常用方法
  • dockerfile cmd enterpoint,docker run cmd entrypoint的区别
  • asp fileupload,
  • asp fileupload,,aspupload 3.0 下载与使用集锦
  • apache任意文件上传,apache服务器上传文件,Apache commons fileupload文件上传实例讲解
  • ,,聊聊MultipartFile与File的一些事儿
  • ,,病毒Autorun.inf、pagefile.pif等的解决办法
  • ,,File.createTempFile创建临时文件的示例详解
  • 留言与评论(共有 条评论)
       
    验证码: