Docker 镜像调试最佳实践

当你已经构建了一个 Docker 镜像,但运行它的容器启动后立即退出(通常是因为服务异常或配置错误),你仍然可以通过以下几种方式进入镜像内部进行调试


✅ 最佳实践:如何对一个“启动即退出”的镜像进行命令行调试?

🧭 目标

进入容器的命令行环境,即使它默认运行的服务会失败。


✅ 方法一:使用 docker run 覆盖 CMD,直接进入 shell

这是最推荐的方式。

🔧 命令:

docker run -it --rm openeuler/dns:22.03-lts-sp4 /bin/sh

💡 说明:

  • -it:启用交互式终端。
  • --rm:退出后自动删除容器(临时调试用)。
  • /bin/sh:覆盖镜像的默认 CMD,不运行服务,而是进入 shell。
  • 如果你的镜像中没有 bash,[sh](file://e:\docker_workspaces(svn.home)\base_systems\openEuler_dns\CreateContainer.sh) 通常是存在的。

👇 示例输出:

/ # ls /etc/named.conf
/etc/named.conf

你可以在这个 Shell 中检查配置文件、权限、用户是否存在等问题。


✅ 方法二:使用 docker run + --entrypoint 进入(适用于自定义 ENTRYPOINT 的情况)

如果你的镜像设置了 ENTRYPOINT(比如总是运行某个脚本),你可以通过 --entrypoint 覆盖它。

🔧 命令:

docker run -it --rm --entrypoint /bin/sh openeuler/dns:22.03-lts-sp4

💡 说明:

  • --entrypoint 会忽略 Dockerfile 中定义的 ENTRYPOINTCMD
  • 然后你再手动执行你想测试的命令,例如:
    /usr/sbin/named -g -c /etc/named.conf
    

✅ 方法三:创建一个新的调试镜像(适合复杂场景)

如果你经常需要调试这个镜像,可以新建一个用于调试的镜像,修改其行为。

1. 创建 [debug.Dockerfile](file://e:\docker_workspaces(svn.home)\base_systems\openEuler_dns\debug.Dockerfile) 文件:

FROM openeuler/dns:22.03-lts-sp4# 覆盖原 CMD,改为进入 Shell
CMD ["/bin/sh"]

2. 构建调试镜像:

docker build -f debug.Dockerfile -t openeuler/dns:debug .

3. 启动并调试:

docker run -it --rm openeuler/dns:debug

这样你就可以在一个和原镜像几乎一致的环境中进行排查了。


✅ 方法四:查看日志 + inspect 日志文件 + 挂载目录分析

如果你只是想快速查看出错原因,可以结合以下命令定位问题:

🔍 查看容器日志:

docker logs <container_name_or_id>

🔍 进入容器文件系统(即使没运行):

docker create --name debug-container openeuler/dns:22.03-lts-sp4
docker cp debug-container:/var/log/messages ./messages.log
cat ./messages.log

或者挂载目录后查看文件:

docker run -it --rm -v ./debug:/mnt openeuler/dns:22.03-lts-sp4 /bin/sh
ls /mnt

✅ 方法五:使用 scratch 容器复制文件出来分析

有时你只需要看看里面的文件内容而不运行服务本身。

docker create --name temp openeuler/dns:22.03-lts-sp4
docker cp temp:/etc/named.conf ./named.conf
docker rm temp

然后在宿主机上编辑、检查配置。


✅ 方法六:使用 nsenter 进入容器命名空间(高级)

如果你有运行过的容器(哪怕只运行了几秒),可以用 nsenter 进入其命名空间。

1. 查看容器 PID:

docker inspect <container_id> | grep HostPid

2. 使用 nsenter 进入:

sudo nsenter -t <PID> -m -u -i -n -p

这可以让你看到容器内完整的进程、网络、挂载信息。


✅ 总结:不同场景下的调试策略

场景推荐方法
容器启动后立刻退出使用 docker run ... /bin/sh 替换 CMD
使用了 ENTRYPOINT使用 --entrypoint /bin/sh
需要保留容器状态使用 docker create + docker cp
想复用原有逻辑调试创建 debug.Dockerfile 并重新构建
分析配置文件使用 docker cp 或 mount volume
高级调试(pid/ns)使用 nsenterdocker inspect

✅ 附注:如何查看容器退出原因?

docker inspect <container_id> | grep -i "exit_code"
# 或者
docker inspect <container_id> | grep -A 10 "State"

输出示例:

"State": {"ExitCode": 1,"Error": "","FinishedAt": "2025-05-20T12:00:00Z","Running": false,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 0,"ExitCode": 1,"Error": "","StartedAt": "2025-05-20T11:59:59Z","FinishedAt": "2025-05-20T11:59:59Z"
}

如果 ExitCode != 0,表示非正常退出,结合日志进一步查错。


✅ 最终建议流程

# 1. 进入容器 shell
docker run -it --rm openeuler/dns:22.03-lts-sp4 /bin/sh# 2. 手动运行 DNS 服务以调试
/usr/sbin/named -g -c /etc/named.conf# 3. 检查文件权限
ls -l /var/named# 4. 查看日志文件
cat /var/log/messages# 5. 检查 named 用户是否存在
id named

如果你愿意贴出完整的 [Dockerfile](file://e:\docker_workspaces(svn.home发生异常,可以输入更多信息再让我来回答或重试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/82353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Java制作贪吃蛇小游戏

在这篇文章中&#xff0c;我将带你一步步实现一个经典的贪吃蛇小游戏。我们将使用Java语言和Swing库来构建这个游戏&#xff0c;它包含了贪吃蛇游戏的基本功能&#xff1a;蛇的移动、吃食物、计分以及游戏结束判定。 游戏设计思路 贪吃蛇游戏的基本原理是&#xff1a;玩家控制…

【linux】umask权限掩码

umask这个接口在一些程序初始化的时候经常会见到&#xff0c;处于安全性&#xff0c;可以缩小进程落盘文件的权限。 1、linux文件系统的权限规则 文件的默认权限由系统决定&#xff08;通常是 0666&#xff0c;即所有人可读可写&#xff09;。 目录的默认权限通常是 0777&am…

esp32cmini SK6812 2个方式

1 #include <SPI.h> // ESP32-C系列的SPI引脚 #define MOSI_PIN 7 // ESP32-C3/C6的SPI MOSI引脚 #define NUM_LEDS 30 // LED灯带实际LED数量 - 确保与实际数量匹配&#xff01; #define SPI_CLOCK 10000000 // SPI时钟频率 // 颜色结构体 st…

互联网大厂Java求职面试:Spring Cloud微服务架构设计中的挑战与解决方案

互联网大厂Java求职面试&#xff1a;Spring Cloud微服务架构设计中的挑战与解决方案 面试场景设定 郑薪苦是一位拥有丰富实战经验的Java开发者&#xff0c;他正在参加一场由某知名互联网大厂的技术总监主持的面试。这场面试将围绕Spring Cloud微服务架构展开&#xff0c;涵盖…

品鉴JS的魅力之防抖与节流【JS】

前言 小水一波&#xff0c;函数的防抖与节流。 文章目录 前言介绍实现方式防抖节流 介绍 防抖与节流的优化逻辑&#xff0c;在我们的日常开发中&#xff0c;有着一定的地位。 防抖和节流是两种常用的性能优化技术&#xff0c;用于限制某个函数在一定时间内被触发的次数,减少不…

# 使用 Hugging Face Transformers 和 PyTorch 实现信息抽取

使用 Hugging Face Transformers 和 PyTorch 实现信息抽取 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;信息抽取是一种常见的任务&#xff0c;其目标是从文本中提取特定类型的结构化信息。本文将介绍如何使用 Hugging Face Transformers 和 PyTorch 实现基于大…

Firecrawl MCP Server 深度使用指南

无论是市场分析师洞察行业动态、研究者收集学术资料&#xff0c;还是开发者为智能应用采集数据&#xff0c;都对网络数据采集工具提出了极高的要求。Firecrawl MCP Server 应运而生&#xff0c;它宛如一把犀利的 “数字手术刀”&#xff0c;能够精准地剖析网页&#xff0c;为用…

OceanBase数据库全面指南(基础入门篇)

文章目录 一、OceanBase 简介与安装配置指南1.1 OceanBase 核心特点1.2 架构解析1.3 安装部署实战1.3.1 硬件要求1.3.2 安装步骤详解1.3.3 配置验证二、OceanBase 基础 SQL 语法入门2.1 数据查询(SELECT)2.1.1 基础查询语法2.1.2 实际案例演示2.2 数据操作(INSERT/UPDATE/DE…

几种环境下的Postgres数据库安装

1. Postgres 数据库介绍 PostgreSQL&#xff08;又称 Postgres&#xff09;是一种强大、开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它具备高度的可靠性、稳定性和可扩展性&#xff0c;主要特点如下&#xff1a; 开源&#xff1a;PostgreSQL 是基于开…

函数[x]和{x}在数论中的应用

函数[x]和{x}在数论中的应用 函数[x]和{x}的定义与基本性质&#xff08;定义1&#xff0c;命题1&#xff09;定义1例1命题1 函数[x]和{x}的应用&#xff08;定理1&#xff0c;推论1-推论3&#xff09;例2定理1注解5推论1例3例4推论2推论3命题2 函数[x]和{x}的定义与基本性质&am…

Python爬虫(32)Python爬虫高阶:动态页面处理与Scrapy+Selenium+BeautifulSoup分布式架构深度解析实战

目录 引言一、动态页面爬取的技术背景1.1 动态页面的核心特征1.2 传统爬虫的局限性 二、技术选型与架构设计2.1 核心组件分析2.2 架构设计思路1. 分层处理2. 数据流 三、代码实现与关键技术3.1 Selenium与Scrapy的中间件集成3.2 BeautifulSoup与Scrapy Item的整合3.3 分布式爬取…

FreeSWITCH rtcp-mux 测试

rtcp 跟 rtp 占用同一个端口&#xff0c;这就是 rtcp 复用 Fs 呼出是这样的&#xff1a; originate [rtcp_muxtrue][rtcp_audio_interval_msec5000]user/1001 &echo 需要同时指定 rtcp_audio_interval_msec&#xff0c;否则 rtcp_mux 不能生效 Fs 呼入不需要配置&#xf…

day019-特殊符号、正则表达式与三剑客

文章目录 1. 磁盘空间不足-排查流程2. 李导推荐书籍2.1 大话存储2.2 性能之巅 3. 特殊符号3.1 引号系列&#xff08;面试题&#xff09;3.2 重定向符号3.2.1 cat与重定向3.2.2 tr命令&#xff1a;替换字符3.2.3 xargs&#xff1a;参数转换3.2.4 标准全量追加重定向 4. 正则表达…

Vue3 watch 使用与注意事项

watch 的第一个参数可以是不同形式的“数据源”&#xff1a;它可以是一个 ref (包括计算属性)、一个响应式对象、一个 getter 函数、或多个数据源组成的数组&#xff1a; 1&#xff1a;reactive监听对象 <template><div><h1>情况二&#xff1a;watchEffect…

医学写作供应商管理全流程优化

1. 供应商筛选与评估 1.1 资质审核 1.1.1 行业认证核查 核查供应商的行业认证,如AMWA医学写作认证、EMWA会员资格、ISO 9001等,确保其专业资质。 1.1.2 团队背景评估 评估团队成员专业背景,包括医学/药学学位、临床试验经验、发表记录,保障专业能力。 1.1.3 国际规范熟悉…

固态硬盘颗粒类型、选型与应用场景深度解析

一、固态硬盘颗粒类型的技术演进与特性 固态硬盘&#xff08;SSD&#xff09;的性能核心在于存储单元结构的设计&#xff0c;这种设计直接决定了数据的存储密度、读写速度、耐久度及成本效益。当前主流的闪存颗粒类型呈现从单层到多层架构的梯度演进&#xff0c;其技术特征与应…

CAPL自动化-诊断Demo工程

文章目录 前言一、诊断控制面板二、诊断定义三、发送诊断通过类.方法的方式req.SetParameterdiagSetParameter四、SendRequestAndWaitForResponse前言 本文将介绍CANoe的诊断自动化测试,工程可以从CANoe的 Sample Configruration 界面打开,也可以参考下面的路径中打开(以实…

嵌入式预处理链接脚本lds和map文件

在嵌入式开发中&#xff0c;.lds.S 文件是一个 预处理后的链接脚本&#xff08;Linker Script&#xff09;&#xff0c;它结合了 C 预处理器&#xff08;Preprocessor&#xff09; 的功能和链接脚本的语法。它的核心作用仍然是 定义内存布局和链接规则&#xff0c;但通过预处理…

PT5F2307触摸A/D型8-Bit MCU

1. 产品概述 ● PT5F2307是一款51内核的触控A/D型8位MCU&#xff0c;内置16K*8bit FLASH、内部256*8bit SRAM、外部512*8bit SRAM、触控检测、12位高精度ADC、RTC、PWM等功能&#xff0c;抗干扰能力强&#xff0c;适用于滑条遥控器、智能门锁、消费类电子产品等电子应用领域。 …

RabbitMQ——消息确认

一、消息确认机制 生产者发送的消息&#xff0c;可能有以下两种情况&#xff1a; 1> 消息消费成功 2> 消息消费失败 为了保证消息可靠的到达消费者&#xff08;&#xff01;&#xff01;&#xff01;注意&#xff1a;消息确认机制和前面的工作模式中的publisher confi…