Dockerfile 中 CMD 为什么要避免使用 sh -c

2023-11-17

CSDN 中文章不一定能及时更新,欢迎点击前往我的博客查看最新版本:许盛的博客

Dockerfile 中的 CMD 命令,有 exec formshell form 两种形式,具体区别可以参考: Dockerfile 中 CMD 写法的区别

推荐使用 exec form 而不是 shell form ,因为使用 exec form 时可以将实际的应用程序作为容器中的主进程,而使用 shell form 时,容器中的主进程实际上是 sh

当我们需要终止一个容器时,需要向这个容器传递 signal ,然后由主进程捕获 signal 并退出。

但是 sh 默认并不会处理 signal(kill 除外) ,在 k8s 集群中终止容器时,会先向其发送 SIGTERM 信号,然后由应用程序响应后自行退出,达到优雅退出的目的。

如果容器的主进程是 sh,那么 sh 接收到信息后,并不会传递给子进程,也不会退出,会导致容器退出失败,等待超时后被 k8s 强制 kill 掉。

可以实践一下进行验证。

exec form 写法

准备一个 Dockerfile 文件,内容如下:

FROM nginx
MAINTAINER https://www.xuxusheng.com
CMD ["nginx", "-g", "daemon off;"]

这种写法就是 exec form,基于此镜像运行的容器内主进程应该为 nginx

再使用如下命令运行一个容器起来。

# 构建镜像
docker build -t my-nginx .

# 运行容器
docker run --name my-nginx my-nginx

可以看到容器正常启动了。

Untitled

再通过命令 docker top my-nginx 可以看到:

Untitled

此时容器中主进程为 nginx

再使用 ps 命令查询到刚才运行的 docker run 命令的 pid

Untitled

如上所示,使用命令 kill -15 <pid> 向其传递 SIGTERM 信号,会发现容器正常退出。

直接在容器运行的终端中使用 ctrl + c 也会正常退出(传递 SIGINT 信号)。

shell form

准备如下 Dockerfile 文件:

FROM nginx
MAINTAINER https://www.xuxusheng.com
CMD nginx -g "daemon off;"

这种写法为 shell form 形式,容器中主进程会变成 sh

重复上一节中的各个步骤,可以看到 docker top 命令输出如下:

Untitled

此时不管是使用 kill -15 <pid> 还是 ctrl + c 方式,会发现容器都无法正常退出。

所以结论是,尽量避免使用 CMDshell form 写法,让容器中的主进程是你的应用程序而不是 sh,避免容器无法正常退出。

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

Dockerfile 中 CMD 为什么要避免使用 sh -c 的相关文章

  • Docker 中的 Electron:SIGTRAP、ELIFECYCLE、errno1

    介绍 我有一个演示电子应用程序 运行时运行良好npm run start从我的Mac 我有兴趣将应用程序移至 Docker 容器中 但是当docker compose达到electron命令步骤 我得到以下信息 gt electron no
  • docker-compose:容器之间的 Redis 连接被拒绝

    我正在尝试设置一个 docker compose 文件 该文件旨在替换运行多个进程 RQ 工作线程 RQ 仪表板和 Flask 应用程序 的单个 Docker 容器解决方案导师 http supervisord org 主机系统是 Debi
  • Gitlab CI服务端口是如何暴露的?

    我有一个 gitlab ci yml file integration test services name registry gitlab com group project testmailserver 1 1 alias mail e
  • 为什么我无法通过“docker-compose run web”命令运行 django 迁移?

    所以我通过 docker compose 部署 django postgres 和 nginx 容器 但我遇到了一个我似乎无法解决的问题 为了解决 Django 应用程序中的以下错误 我知道我只需要运行 Django 迁移 docker p
  • 从 docker 中的脚本创建 SQL Server 数据库

    我希望这是一个简单的问题 我在任何地方都找不到任何东西 如何在Microsoft SQL Server Docker容器 Dockerfile 我正在看以下内容Dockerfile FROM microsoft mssql server w
  • 实时/热重载不适用于 dockerized NestJS API

    我遇到了一个奇怪的问题 我目前正在使用 Windows 10 并通过 WSL2 运行 docker 我在 Windows 文件管理器中克隆了存储库 并且我尝试在 DEV 中运行它 也就是说 一旦我更新了在我的本地存储库中的文件中 此更改反映
  • Docker Compose - 如何执行多个命令?

    我想做这样的事情 我可以在以下代码中运行多个命令 db image postgres web build command python manage py migrate command python manage py runserver
  • (Docker) 如何在 WordPress 容器中使用单独的 Composer 容器安装依赖项?

    Dockerfile FROM wordpress ENV REFRESHED AT 2015 08 12 ADD composer json var www html ADD composer lock var www html inst
  • dockerfile 没有创建目录并复制文件?

    我的 dockerfile 中有以下内容 还有很多 不过我把相关的部分贴在这里了 RUN useradd jenkins USER jenkins Maven settings RUN mkdir m2 COPY settings xml
  • 无法解析 docker 容器之间的主机名

    我在单独的撰写文件中创建了两个容器 用于应用程序隔离 每个应用程序可能在撰写文件中定义了多个容器 例如后备数据库 这些容器通过名为 common 的外部网络链接 一个示例撰写文件是 version 2 services rabbitmq i
  • Docker exec linux 终端创建别名

    我有一个正在运行且独立的容器 我想在附加到该容器之前创建一个命令别名 当我连接到容器并输入 alias bar foo 创建别名 并可以通过以下方式检查 alias command 但如果我想做同样的事情码头执行者命令即这样 docker
  • Daphne Django 文件上传大小限制

    我使用 Daphne 进行套接字和 http 连接 我正在运行 4 个工作容器 并且现在在 docker 容器中本地运行所有内容 如果我尝试上传 400MB 的文件 我的 daphne 服务器会失败 它适用于最大 15MB 的小文件 我的
  • Docker CentOS systemctl 不允许

    我尝试使用 systemctl 命令构建 CentOS 映像 但每次当我建造它时 我收到此错误 Step 5 7 RUN systemctl enable syslog ng systemctl start syslog ng gt Run
  • 没有足够的熵来支持在 boot2docker 中运行的 docker 容器中的 /dev/random

    在虚拟化 Linux 系统中耗尽熵似乎是一个常见问题 例如 dev random 非常慢 https stackoverflow com questions 4819359 dev random extremely slow 让 linux
  • Docker 多个相同端口问题

    我目前正在解决方案中开发两个相互关联的 ASP NET Core WebAPI 服务 Service1 和 Service2 两者都有 docker 文件并暴露端口 80 Service1是一个独立的服务 需要从Service2调用 我已经
  • Docker - 如何通过 API 将输入发送到程序

    我一直在使用 Docker 的远程 API 创建一个容器 在其中运行一个 Python 程序 附加到该容器并将写入 stdout 的输出流式传输到网络 现在 我希望我的 Python 程序接受来自 stdin 的用户输入 例如 import
  • 在 docker 容器内创建 android 模拟器时出现“sh: 1: file: not found”

    我正在尝试在 docker 容器内创建一个 android 模拟器 但遇到了一些问题 SDK 更新和 AVD 创建成功 我尝试创建模拟器 出现以下错误 emulator avd test 22 no skin no audio no win
  • Docker Python 脚本找不到文件

    我已经成功构建了一个 Docker 容器 并将应用程序的文件复制到 Dockerfile 中的容器中 但是 我正在尝试执行引用输入文件 在 Docker 构建期间复制到容器中 的 Python 脚本 我似乎无法弄清楚为什么我的脚本告诉我它无
  • 带有 mysql 数据的 WordPress 图像

    是否有包含 wordpress 和 mysql 数据的可用图像 当我提交并备份映像时 不包括 mysql 数据 我更喜欢两者都用一张图片 我尝试使用这个 Dockerfile 创建这样的图像 FROM tutum lamp latest R
  • 如何避免应用程序停止后 docker 容器停止

    有一个带有 Postgres 服务器的 docker 容器 postgres 停止或崩溃 无关紧要 我需要检查一些环境变量和一些文件的状态 默认情况下 容器在应用程序完成后停止 我知道有一个选项可以更改 dockerfile 中的默认行为

随机推荐

  • 修改html代码页面没有变化,VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析...

    本文实例讲述了VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法 分享给大家供大家参考 具体如下 业务场景 我们在使用vue 编写 代码时 我们有一个 多行文本框控件 希望在页面点击一个按钮 在 文本框焦点位置插入一个
  • 星星之火-32: 扩频码、OVSF正交扩频码、Walsh函数、信道码;扰码、伪随机码序列、m序列码、Gold码序列

    1 OVSF正交扩频码 OVSF是Orthogonal Variable Spreading Factor的缩写 叫正交可变扩频因子 系统根据扩频因子的大小给用户分配资源 数值越大 提供的带宽越小 2 Walsh函数 是J L Wash于1
  • 使用 exceljs 导出表格有下拉框(浏览器,客户端)

    exceljs服务端导出表格 浏览器直接用不了 nodejs的运行环境和浏览器的不同 exceljs min js 下载地址 https www bootcdn cn exceljs git的exceljs里面没有这个文件 代码和nodej
  • Linux之常用命令解压缩

    总结一下Linux的解压缩命令 包括tar zip 下面是一些常用的解压缩命令 1 解压缩 tar 文件 解压缩 tar 文件 tar xvf 文件名 tar 解压缩 tar gz 或 tgz 文件 tar xzvf 文件名 tar gz
  • 微信H5支付

    微信支付流程 大概就是这个样子 也包括支付宝 各大银联差不多一个流程 也就是传递的参数略有不同 用户通过客户端下一个订单 后台根据用户下的商品来生成一个订单 然后可以有一个订单确认页面 以显示订单是否完整 之后确认订单 把订单信息发送给微信
  • 有discuz数据库,忘了管理员密码,怎样进后台

    很简单 你注册一个用户 密码设个简单一点的 然后在ucenter的数据库中uc members表中找到这个用户的password字段和salt字段 把你在uc members表中的管理员账号的password和salt字段修改成新注册用的的
  • rename()函数

    rename 函数 可以直接通过columns 去传入对应列的名字 去改变列名 这种效率比rename的效率要高的多 score columns python java ps js rename 函数的参数 mapper None axis
  • 对上拉下拉电阻的作用的总结

    一 定义 上拉就是将不确定的信号通过一个电阻嵌位在高电平 电阻同时起限流作用 下拉同理 上拉是对器件注入电流 下拉是输出电流 弱强只是上拉电阻的阻值不同 没有什么严格区分 对于非集电极 或漏极 开路输出型电路 如普通门电路 提升电流和电压的
  • 掌握shell编程中的细节:轻松应对可能出现的考点(括号篇)

    前言 只要是shell脚本基本都会用这几个符号 重点是你会不会口语描述其功能 下面是对shell里各种括号的实际的演示和功能的描述 小括号or单小括号 功能 命令的集合 括号内的命令会在一个子shell中按顺序执行 括号内的写的变量不会被括
  • docker镜像详解

    目录 什么是docker镜像 镜像相关命令 docker pull docker images docker search docker rmi 导出 导入镜像 镜像分层 镜像摘要 镜像摘要的作用 分发散列值 什么是docker镜像 Doc
  • 帆软填报界面首页黑色

    解决方法 左上角 gt 模板 gt 模板web属性 gt 填报的话 选填报界面 gt 为该模板单独设置 gt 左上角 填报当前行背景颜色 gt 改成 白色 或其他
  • 统计字符串中每个单词出现的个数和频率----四种方法

    统计每个单词出现的个数 三种方法 第一种如下 最简单的方式 sentance I can because i think i can 切片分隔成列表序列 用列表推导式表达 rresult word sentance split count
  • 认识数据中心两个关键指标RTO和RPO

    RTO和RPO是Business Continuity BC and Disaster Recovery DR 里面两个重要的概念 也是类似产品的Service Level Agreement SLA 的两个重要的衡量指标 Recovery
  • 观察者模式和事件通知备忘

    观察者模式和事件通知备忘 MessageBus instance post Notify PARKIN in bytes 这种是仿照Android的EventBus 用new的一个实例对象根据path反射调用其中的方法处理逻辑 要修改为 r
  • 【JVM】如何通俗地讲解JVM各个组成部分和其基本功能?

    类加载器 ClassLoader 运行时数据区 Runtime Data Area 执行引擎 Execution Engine 本地库接口 Native Interface 组件的作用 首先通过类加载器 ClassLoader 会把 Jav
  • (服务计算)在centos上编写golang的库,并进行测试

    首先是在centos上按照老师给的教程安装golang的相关内容 安装成功后进行后面的操作 首先是创建了一个hello go的文件 然后执行结果如下 可知安装基本正确 然后编写第一个库 首先创建包路径 然后创建名为reverse go的文件
  • 图形学基础1

    坐标系相关 uv可能会影响局部坐标系 如果light图和brdf图做卷积的时候 局部坐标系保持一致很重要 如下图 tangent是从外部模型文件进行加载的 切线空间采样并转世界坐标系 spherical to cartesian in ta
  • unity配置.asset文件

    unity配置数据可以XML 可以JSON unity自带的 asset文件也可以哦 而且能配置的数据类型也比较多 这里说明一下怎么在unity中生成 asset文件 首先来个脚本 using System using System Col
  • 【华为OD机试真题 python】报文解压缩

    题目描述 为了提升数据传输的效率 会对传输的报文进行压缩处理 输入一个压缩后的报文 请返回它解压后的原始报文 压缩规则 n str 表示方括号内部的 str 正好重复 n 次 注意 n 为正整数 0 lt n lt 100 str只包含小写
  • Dockerfile 中 CMD 为什么要避免使用 sh -c

    CSDN 中文章不一定能及时更新 欢迎点击前往我的博客查看最新版本 许盛的博客 Dockerfile 中的 CMD 命令 有 exec form 和 shell form 两种形式 具体区别可以参考 Dockerfile 中 CMD 写法的