入口点于CMD命令在Dockerfile中使用有哪些区别

  介绍

今天就跟大家聊聊有关入口点于CMD命令在Dockerfile中使用有哪些区别,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

<强> CMD指令

CMD指令指定容器启动时需要运行的程序。一般用最简单的方式启动一个容器时使用码头工人运行会传递参数给码头工人指令

码头工人运行——形象/bin/bash

后面的/bin/bash其实是传递参数,告知容器启动时运行一个壳。这个过程可以用CMD指令等效的替换

CMD [& # 39;/bin/bash # 39;]

因此在Dockerfile中存在这个CMD指令指定的命令时,启动容器就可以不进行参数传递。

码头工人运行——形象

执行效果一致。

[root@MiWiFi-R3L-srv测试]#码头工人运行——名字测试——test_image

[root@3a1bb0c9e35c/] #

如果Dockerfile中已经指定了容器启动时运行的程序,同时在使用码头工人运行启动容器时使用了命令行参数,那么Dockerfile中的CMD指令将无效

码头工人运行——形象/bin/ps

发现启动容器后没有壳,只是打印出了当前容器中的进程状态,CMD指令效果被覆盖。

 PID TTY CMD
  1,# 63;就是ps
  [root@MiWiFi-R3L-srv测试]# 

此时可以看到cmd效果被覆盖。在一个dockerfile中只有最后一个cmd指令有效,因此一个dockerfile中只写一个cmd指令。

<强>入口点指令

入口点指令效果与cmd非常的类似,比较容易混淆两者的功能。最大的区别在于使用的方式,入口点指定的命令需要与码头工人运行启动容器进行搭配,将码头工人运行指令后面跟的内容当做参数作为入口点指令指定的运行命令的参数,入口点指定的linux命令一般是不会被覆盖的。

以nginx镜像为例说明

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

  

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

<强>两者联合使用技巧

已经明白了两者的区别,可以利用两者的特点构建一个含有默认启动运行程序的镜像,并且支持码头工人运行启动时人为指定启动程序运行的参数。

举个例子。利用入口点指定启动时运行启动nginx程序,并给定默认的运行参数为显示帮助信息,dockerfile构建如下:

入口点(“/usr/sbin/nginx"]

CMD (“-h")

当使用码头工人运行——名字测试——test_nginx不传递任何参数时,此时启动容器会使用CMD指令后的命令作为默认参数,打印nginx的帮助信息。此时CMD后的内容并不是一个完整的指令,而是参数,如果其内容是一个完整的指令,那么它将覆盖掉入口点中的内容。

如果使用码头工人运行——名字测试——test_nginx - g“守护进程off"启动时,此时给定的运行参数会覆盖掉CMD指令对应的内容,此时nginx将作为前台进程运行,作为一个web服务器使用,通过浏览器可以看到hello world

<强> docker-entrypoint。sh入口文件编写技巧

在码头工人的官方注册表中(store.docker.com)流行的第三方应用在自己的页面中都提供了dockerfile的链接。而很多dockerfile的入口点命令都是这么写的(“docker-entrypoint.sh")

本篇文章就扫盲下docker-entrypoint。sh的特殊用法和设计逻辑

<强> MySQL

设置- e

你写的每个脚本都应该在文件开头加上设置- e,这句语句告诉bash如果任何语句的执行结果不是真正的则应该退出。这样的好处是防止错误像滚雪球般变大导致一个致命的错误,而这些错误本应该在之前就被处理掉。如果要增加可读性,可以使用- o errexit集合,它的作用与设置- e相同

设置- o pipefail

设计用途同上,就是希望在执行错误之后立即退出,不要再向下执行了。而o pipefail的作用域是管道,也就是说在Linux脚本中的管道,如果前面的命令执行出了问题,应该立即退出

入口点于CMD命令在Dockerfile中使用有哪些区别