专业IT网络知识平台,分享IT百科知识、生活百科知识解答!

易企推科技
易企推科技

Entrypoint,Dockerfile中cmd和entrypoint区别详解

来源:小易整编  作者:小易  发布时间:2023-02-13 12:40
摘要:Dockerfile中cmd和entrypoint区别详解ENTRYPOINT和CMD的作用都是执行命令。看起来有一些重复。但是他们还是有一些微妙的区别。CMD与ENTRYPOINT覆盖ENTRYPOINT或者CMD命令会自动覆盖之前的EN...

Dockerfile中cmd和entrypoint区别详解

ENTRYPOINT和CMD的作用都是执行命令。看起来有一些重复。但是他们还是有一些微妙的区别。

Entrypoint,Dockerfile中cmd和entrypoint区别详解

CMD与ENTRYPOINT覆盖

ENTRYPOINT或者CMD命令会自动覆盖之前的ENTRYPOINT或者CMD命令.

所以,在docker镜像运行时, 我们可以在命令指定具体命令, 覆盖在Dockerfile里的命令.

比如,这样的一个Dockerfile

FROM ubuntu:trustyCMD ["/bin/ping", "localhost"]

默认运行这个镜像是ping 本机。

我们可以在执行时覆盖这个默认命令。比如用hostname命令替换ping命令。

# docker run demo:1.0 hostname

Entrypoint,Dockerfile中cmd和entrypoint区别详解

ENTRYPOINT也是一样的,只不过覆盖时要用--entrypoint

FROM ubuntu:trustyENTRYPOINT ["/bin/ping", "localhost"]

# docker run --entrypoint hostname demo:1.0e2540a13d1f8

所以,CMD命令更容易被docker run命令的方式覆盖。相反, 如果你希望你的docker镜像只执行一个具体程序, 不希望用户在执行docker run的时候随意覆盖默认程序. 建议用ENTRYPOINT.

CMD与ENTRYPOINT两种写法

CMD和ENTRYPOINT指令的都有两种格式写法。shell写法和exec写法。

上面例子是Exec写法。

这两种写法是有一个本质区别的。

同样是ping localhost。用exec写法启动的容器

# docker exec caed34225b48 ps -fUID       PID PPID C STIME TTY         TIME CMDroot         1     0 0 08:43 ?       00:00:00 /bin/ping localhostroot         6     0 0 08:44 ?       00:00:00 ps -f

可以看到PID 1启动的就是ping命令。

再看下shell写法的结果

# docker exec 545269dc6d49 ps -fUID       PID PPID C STIME TTY         TIME CMDroot         1     0 0 08:46 ?       00:00:00 /bin/sh -c /bin/ping localhostroot         6     1 0 08:46 ?       00:00:00 /bin/ping localhostroot         7     0 0 08:46 ?       00:00:00 ps -f

可以看到PID 1启动的其实是sh程序,我们的ping命令作为sh的子程序运行了。

这样会导致的一个问题是,你从外部发给容器的POSIX信号,是被sh接收的,而sh命令并不会将信号转发给ping命令,会导致不能安全的关闭容器。比如用shell方法启动的容器一直在运行,我按Ctrl +C是无法停止的。

所以最好是使用exec写法。

ENTRYPOINT和CMD组合使用

从上面所知,ENTRYPOINT 用于指明程序必须运行的命令。CMD又比较方便覆盖。所以,我们可以将其联合使用,指定必须运行的命令。同时运行用户覆盖一些参数。ENTRYPOINT和CMD同时存在时, docker把CMD的命令拼接到ENTRYPOINT命令之后。

比如

FROM ubuntu:trustyENTRYPOINT ["/bin/ping","localhost","-c"]CMD ["3"]

这样就运行用户自己指定运行的次数。

docker run demo:1.0 5PING localhost (127.0.0.1) 56(84) bytes of data.

64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.045 ms

64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.039 ms

64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.042 ms

64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.041 ms

64 bytes from localhost (127.0.0.1): icmp_seq=5 ttl=64 time=0.035 ms

--- localhost ping statistics ---

5 packets transmitted, 5 received, 0% packet loss, time 3999ms


本文地址:网络知识频道 https://www.hkm168.com/jiqiao/903063.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!


网络知识
小编:小易整编
相关文章相关阅读
  • 什么是构造函数?详解JavaScript中的构造函数

    什么是构造函数?详解JavaScript中的构造函数

    作为原型和原型链的基础,先了解清楚构造函数以及它的执行过程才能更好地帮助我们学习原型和原型链的知识。本篇文章带大家详细了解一下javascript中的构造函数,介绍一下怎么利用构造函数创建一个js对象,希望对大家有所帮助!一个普通的函数被用...

  • uri和url区别和关联

    uri和url区别和关联

    uri和url区别和关联URI,是uniformresourceidentifier,统一资源标识符,用来唯一的标识一个资源。Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的URI一般由三部组成:①访...

  • 什么是Linux系统中nc命令?nc命令的用法详解

    什么是Linux系统中nc命令?nc命令的用法详解

    这篇文章主要介绍了linux系统中nc命令的基本用法,nc命令非常之强大,这里先简单介绍它用来作端口扫描以及文件传输等的基础使用。功能说明:功能强大的网络工具,在网络工具中有“瑞士军刀”美誉,其有Windows和Linux的版本。因为它短小...

  • cmd命令怎么打开?

    cmd命令怎么打开?

    cmd命令的打开方法:1、在电脑桌面中使用“win+r”组合键,打开的“运行”窗口,输入“cmd”命令并回车即可打开;2、打开“开始”菜单,在搜索框中输入“cmd”,点击“cmd.exe”即可打开。CMD一般指命令提示符,命令提示符是在操作...

  • Java中的Scanner操作详解

    Java中的Scanner操作详解

    scanner是java中的一个常用类,用来读取控制台或文件中的输入数据。它提供了一种简单的方式来解析基本类型和字符串,并支持对正则表达式进行匹配。Scanner类位于java.util包中,因此在编写程序时需要import...

  • 带你搞懂git回滚代码(实例详解)

    带你搞懂git回滚代码(实例详解)

    本篇文章给大家带来了关于git回滚代码的相关知识,git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理,希望对大家有帮助。在日常coding的过程中免不了分支之间的合并,回滚、提交、打tag等操作,如果你现...

  • 微信公众号认证和不认证有哪些区别

    微信公众号认证和不认证有哪些区别

    微信公众号认证和不认证的区别在认证标识、功能权限、推送频率、接口权限和用户信任度等方面。详细介绍:1、认证标识,认证公众号会获得官方颁发的认证标识,即蓝色v标志,这个标志可以增加公众号的可信度和权威性,让用户更容易辨别真实的官方公众号;2、...

  • C++中的取余函数详解

    C++中的取余函数详解

    C++中的取余函数详解在C++中,取余运算符(%)用于计算两个数相除的余数。它是一种二元运算符,其操作数可以是任何整数类型(包括char、short、int、long等),也可以是浮点数类型(如float、double)。取余运算符返回的结...

  • 周排行
  • 月排行
  • 年排行

精彩推荐