Dockerfile——ENTRYPOINT详解

2023-11-14


前言

  Entrypoint的作用是,把整个container变成了一个可执行的文件,这样不能够通过替换CMD的方法来改变创建container的方式。但是可以通过参数传递的方法影响到container内部。


一、ENTRYPOINT 命令格式介绍

ENTRYPOINT 有两种格式:

  • ENTRYPOINT [“executable”, “param1”, “param2”] (exec 格式,首选)
  • ENTRYPOINT command param1 param2 (shell 格式)

exec 格式
  docker run image 后面跟的命令行参数将会添加到 ENTRYPOINT 所有参数的最后,且会覆盖掉所有 CMD 命令中的参数。这将允许运行时传递参数给 ENTRYPOINT 命令,例如 docker run image -d 会将 -d 参数传给 ENTRYPOINT 命令 。ENTRYPOINT 命令可以通过 docker run --entrypoint 参数来覆盖 。

shell 格式
  会忽略所有 CMD 命令的参数和 docker run 的命令行参数,ENTRYPOINT 要运行的命令会作为 /bin/sh -c 的子命令运行,而且 /bin/sh 不会传递信号,也就是说 ENTRYPOINT 要运行的命令不是 PID 为 1 的进程,且不会收到 Unix 信号,所以你要执行的命令不会收到 docker stop 发出的 SIGTERM 信号。

二、示例

Exec格式
  用使用CMD的参数,run [image] 会替代CMD参数,会使用run中的多个参数

示例一
ENTRYPOINT ["/bin/echo", "Hello"]
CMD ["world"] //表示默认参数,没提供参数,则使用此参数

docker run -it [image] 输出:Hello world 
docker run -it [image] "hanke"  输出 Hello hanke  ,不使用默认参数
docker run -it [image] "hanke" "hujing"  输出 Hello hankd hujing ,使用多个提供参数

示例二
可以使用 exec 格式的 ENTRYPOINT 来设置稳定的默认命令和参数,再通过CMD 命令设置容易变动的默认值。

FROM ubuntu
ENTRYPOINT["top","-b"]
CMD["-c"]

运行这个容器,可以看到只有 top 一个进程:

$ docker run -it --rm --name testtop -H
top - 08:25:00 up  7:27,  0users,  load average: 0.00, 0.01, 0.05
Threads:   1total,   1running,   0sleeping,   0stopped,   0zombie
%Cpu(s):  0.1 us,  0.1 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   2056668total,  1616832used,   439836free,    99352buffers
KiB Swap:  1441840total,        0used,  1441840free.  1324440cached Mem
PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
    1root      2001974423362080R  0.0  0.1   0:00.04 top

可以通过 docker exec 进一步确认:

$ docker exec-it testps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         12.6  0.1  197522352?        Ss+  08:24   0:00 top -b -H
root         70.0  0.1  155722164?        R+   08:25   0:00 ps aux

Shell格式
  可以给 ENTRYPOINT 命令指定一个纯字符串,它将通过 /bin/sh -c 执行。这种格式会处理 shell 环境变量,忽略所有的 CMD 命令和 docker run 命令行参数。为了确保 docker stop 能正确的停止运行的 ENTRYPOINT 命令,容器需要通过 exec 来启动。

FROM ubuntu
ENTRYPOINT exec top -b

运行这个镜像,将会看到 PID 为 1 的进程:

	$ docker run -it --rm --name test top
	Mem: 1704520K used, 352148K free, 0K shrd, 0K buff, 140368121167873K cached
	CPU:   5% usr   0% sys   0% nic  94% idle   0% io   0% irq   0% sirq
	Load average: 0.08 0.03 0.05 2/98 6
	  PID  PPID USER     STAT   VSZ %VSZ %CPU COMMAND
	    1     0 root     R     3164   0%   0% top -b

如果忘了在 ENTRYPOINT 命令中添加 exec:

FROM ubuntu
ENTRYPOINT top  -b
CMD  --ignored-param1

运行

	$ docker run -it --name test top --ignored-param2
	Mem: 1704184K used, 352484K free, 0K shrd, 0K buff, 140621524238337K cached
	CPU:   9% usr   2% sys   0% nic  88% idle   0% io   0% irq   0% sirq
	Load average: 0.01 0.02 0.05 2/101 7
	  PID  PPID USER     STAT   VSZ %VSZ %CPU COMMAND
	    1     0 root     S     3168   0%   0% /bin/sh -c top -b cmd cmd2
	    7     1 root     R     3164   0%   0% top -b
从 top 的输出中可以看到 PID 为 1 的进程不是 ENTRYPOINT 中设置的命令
这时运行 docker stop test,容器不能优雅的退出(docker stop 命令在一个超时时间后会强制发送 SIGKILL[9] 信号):
	$ docker exec -it test ps aux
	PID   USER     COMMAND
	    1 root     /bin/sh -c top -b cmd cmd2
	    7 root     top -b
	    8 root     ps aux
	$ /usr/bin/time docker stop test
	test
	real	0m 10.19s
	user	0m 0.04s
	sys	0m 0.03s

总结

CMD 和 ENTRYPOINT 命令都定义了容器运行时运行命令。下面有几条规则:

  • Dockerfile 必须有一条 CMD 或 ENTRYPOINT 命令
  • 如果容器作为可执行程序运行,需要指定 ENTRYPOINT 命令,
  • CMD 命令应该用来定义 ENTRYPOINT 命令的默认参数

下表展示了 ENTRYPOINT / CMD 组合:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dockerfile——ENTRYPOINT详解 的相关文章

随机推荐

  • 智能随访系统:提升患者综合服务能力和就医体验,提高医院品牌价值与服务质量

    随着互联网技术的不断发展以及 全民健康 全生命周期管理 概念的深化落实 随访作为医疗过程中的闭环环节 医院传统的人工电话随访方式已不能适应需求 将逐渐被智能化随访系统替代 智能化随访是指结合互联网等主流技术 以专业的随访知识库为基础 提供以
  • uni-app微信小程序开发自定义select下拉多选内容篇

    欢迎点击领取 前端面试题进阶指南 前端登顶之巅 最全面的前端知识点梳理总结 分享一个使用比较久的 技术框架公司的选型 uni app uni ui vue3 vite4 ts 需求分析 微信小程序 uni ui内容 1 创建一个自定义的下拉
  • 基于个人开发的C++MySQL插件使用UE4蓝图连接MySQL数据库

    关于UE4连接数据库 其实很简单 本质上就是使用c 来建立DB操作 再通过封装成蓝图可调用的函数即可 当然一般网络游戏是不需要在蓝图中连接数据库的 因为db操作放在客户端来做是不安全 也是不合理的 试想一下 我如果把你的游戏客户端破解了 是
  • 【推荐算法】FM模型:Factorization Machines

    1 线性回归 在介绍FM之前 我们先简单回顾以下线性回归 回归分析是一种预测性的建模技术 它研究的是因变量 目标 和自变量 预测器 之间的关系 这种技术通常用于预测分析 时间序列模型以及发现变量之间的因果关系 通常使用曲线 直线来拟合数据点
  • Jmeter之json提取器

    目标 步骤 添加 线程组 HTTP 请求 后置处理器 JSON 提取器 配置 引用名称 匹配后的数据要存储的变量名 JSON path json 路径 weatherinfo city 引用 直接引用变量名即可
  • 代码思维怎么训练

    做一个基础页面 表格 表单 导航条 模态框 轮播图 做一个主页 顶部是导航条 导航条的下面是轮播图 右上角是一个注册按钮 点击以后 弹出一个注册的模态框 1 记录思路 2 思路转成注释 越详细越好 3 看着注释写代码 4 如果写不下去 继续
  • 数据库常用SQL语句(二):多表连接查询

    前面主要介绍了单表操作时的相关查询语句 接下来介绍一下多表之间的关系 这里主要是多表数据记录的查询 也就是如何在一个查询语句中显示多张表的数据 这也叫多表数据记录的连接查询 在实现连接查询时 首先是将两个或两个以上的表按照某种关系连接起来
  • nfc(近距离无线通讯技术)

    这个技术由非接触式射频识别 RFID 演变而来 由 飞利浦半导体 现恩智浦半导体 诺基亚和 索尼共同研制开发 其基础是RFID及互连技术 近场通信 Near Field Communication NFC 是一种短距高频的无线电技术 在13
  • 零基础学区块链专栏文章目录

    前往老猿Python博文目录 零基础学区块链专栏 为免费专栏 基于老猿自己零基础学习区块链的知识总结 因此文章一定是循序渐进的介绍区块链相关知识 供类似老猿这种有一定计算机基础但区块链知识为零的同好们参考 但老猿介绍的内容都是概念性的基础知
  • 让你的应用支持新iPad的Retina显示屏

    一 应用图片 标准iOS控件里的图片资源 苹果已经做了相应的升级 我们需要操心的是应用自己的图片资源 就像当初为了支持iPhone 4而制作的 2x高分辨率版本 译者 以下简称高分 图片一样 我们要为iPad应用中的图片制作对应的高分版本
  • java 身边距离怎么查询_附近的人位置距离计算方法

    附近的人的位置用经纬度表示 然后通过两点的经纬度计算距离 根据网上的推荐 最终采用geohash geohash的实现java版 1 importjava util BitSet 2 importjava util HashMap 3 im
  • Pandas删除缺失数据函数--dropna

    在pandas中 dropna函数分别存在于DataFrame Series和Index中 下面我们以DataFrame dropna函数为例进行介绍 Series和Index中的参数意义同DataFrame中大致相同 pandas Dat
  • C# 网络编程之webBrowser乱码问题及解决知识

    在使用PHP MySQL编写网页时 曾近就因为显示中文乱码 口口口 困扰我很长时间 没想到在C 制作浏览器或获取XML页面时也经常会遇到显示中文乱码的问题 可想而知怎样解决编码问题或统一编码问题是非常严重的问题 下面就讲讲我的一些理解及解决
  • 《曾国藩家书》读书手记(修身篇一)

    曾国藩被章太炎评价为 誉之则圣相 谳之则元凶 为什么有这样的评价呢 我们可以看出曾国藩这个人褒贬不一 不过毛和蒋对于曾国藩都是推崇备至 毛说过 吾近于人 独服于曾国藩 看来曾国藩还是有可取之处的 尤其是他的家书 很多人评价甚高 一 修身篇
  • mysql存储引擎层核心服务层_MySQL(逻辑分层,存储引擎,sql优化,索引优化以及底层实现(B+Tree))...

    一 逻辑分层 连接层 连接与线程处理 这一层并不是MySQL独有 一般的基于C S架构的都有类似组件 比如连接处理 授权认证 安全等 服务层 包括缓存查询 解析器 优化器 这一部分是MySQL核心功能 包括解析 优化SQL语句 查询缓存目录
  • 无痕渗透“INSERT INTO”型SQL注入

    原文链接 http www mathyvanhoef com 2011 10 exploiting insert into sql injections html 在某个寂静的深夜 你徘徊在一个网站中 其中包含一个可提交form 需要你输入
  • 通过C#学习redis(集合)

    static void Main string args RedisClient cli new RedisClient 127 0 0 1 6379 password defaultDatabase 0 region 集合操作 Redis
  • Latex 作者上角标,通讯作者的小信封标记

    一 作者上角标 论文中作者的上角标一般用于标记一作二作的单位 添加方式如下 author Lily textsuperscript 1 and Alexw textsuperscript 2 结果如图所示 二 通讯作者的小信封标识 用来表示
  • Java时间日期格式转换

    Java时间格式转换大全 import java text import java util Calendar public class VeDate 获取现在时间 return 返回时间类型 yyyy MM dd HH mm ss pub
  • Dockerfile——ENTRYPOINT详解

    文章目录 前言 一 ENTRYPOINT 命令格式介绍 二 示例 总结 前言 Entrypoint的作用是 把整个container变成了一个可执行的文件 这样不能够通过替换CMD的方法来改变创建container的方式 但是可以通过参数传