当前位置: 首页 > news >正文

调试Docker容器内的程序

为docker镜像添加GDBServer并配置启动入口

以redis为例,参考以下DockerFile示例

FROM redis:latest# 可选:替换为中科大源,提高下载速度
RUN echo 'Types: deb\n\
URIs: http://mirrors.ustc.edu.cn/debian\n\
Suites: bookworm bookworm-updates\n\
Components: main contrib non-free non-free-firmware\n\
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg\n\
\n\
Types: deb\n\
URIs: http://mirrors.ustc.edu.cn/debian-security\n\
Suites: bookworm-security\n\
Components: main contrib non-free non-free-firmware\n\
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg' > /etc/apt/sources.list.d/debian.sources# 安装调试工具
RUN apt-get update && apt-get install -y \gdb \gdbserver \&& rm -rf /var/lib/apt/lists/*# 创建启动脚本
RUN echo '#!/bin/bash\n\
if [ "$DEBUG" = "true" ]; then\n\echo "Starting Redis with gdbserver..."\n\exec gdbserver :1234 redis-server "$@"\n\
else\n\echo "Starting Redis normally..."\n\exec redis-server "$@"\n\
fi' > /usr/local/bin/entrypoint.sh \&& chmod +x /usr/local/bin/entrypoint.shEXPOSE 6379 1234ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]

构建和运行命令

构建镜像

docker build -t redis-debug .# 运行调试模式
docker run -d --name redis-debug \-p 6379:6379 \-p 1234:1234 \--cap-add=SYS_PTRACE \          # 让gdbserver能使用ptrace追踪Redis进程--security-opt seccomp=unconfined \ # 允许gdbserver执行所有必要的系统调用-e DEBUG=true \redis-debug# 运行普通模式
docker run -d --name redis-normal \-p 6380:6379 \redis-debug# 验证Redis运行
docker exec redis-debug redis-cli ping# 连接gdbserver调试
gdb -ex "target remote localhost:1234"

Docker Compose配置

version: '3.8'
services:redis-debug:build:context: .dockerfile: Dockerfile.redis-debugimage: redis-debugports:- "6379:6379"- "1234:1234"environment:- DEBUG=truesecurity_opt:- "seccomp=unconfined"cap_add:- SYS_PTRACEvolumes:- redis-data:/datanetworks:- redis-networkredis-normal:image: redis-debugports:- "6380:6379"environment:- DEBUG=falsevolumes:- redis-normal-data:/datanetworks:- redis-networkvolumes:redis-data:redis-normal-data:networks:redis-network:driver: bridge

额外参数说明

  1. --cap-add=SYS_PTRACE:添加“追踪”能力
    Linux将root特权拆分成了数十个独立的能力(Capabilities)。默认情况下,容器即使以root运行,权限也已被大幅削减。
  • SYS_PTRACE能力:允许进程使用ptrace()系统调用,这是调试器(如GDB)跟踪、控制其他进程的基础。
  • 如果不添加:在容器内运行GDB尝试附加(attach)到进程时,会看到ptrace: Operation not permitted错误。

其他常用调试相关的能力
--cap-add=SYS_ADMIN # 执行管理操作(风险高)
--cap-add=NET_ADMIN # 网络配置(如修改iptables)
--cap-add=IPC_LOCK # 锁定内存(某些数据库需要)

  1. --security-opt seccomp=unconfined:放开系统调用限制
    Seccomp(安全计算模式) 是Linux内核的“系统调用防火墙”,它限制容器可以使用的系统调用(syscall)。Docker为容器提供了一个默认的、相对严格的Seccomp配置文件。
  • seccomp=unconfined:意味着完全禁用这个“防火墙”,容器内的进程几乎可以执行任何系统调用(类似于宿主机进程)。
  • 调试场景需要:像GDB、Strace这类底层调试工具,可能会使用一些非常规的系统调用,这些调用可能被默认的Seccomp配置文件拦截。
  • 生产环境警告:极度不建议在生产容器中使用此选项,它会显著增加容器逃逸或攻击宿主机的风险。

删除原镜像
构建好可调试镜像后,可以删除原镜像,但由于构建镜像继承于原镜像,需要为新构建镜像分配一个独立tag,随后才能将原有镜像和新构建镜像的原始tag一并删除

sudo docker tag redis-debug:latest redis-debug:7.2.5
sudo docker rmi redis-debug:latest
sudo docker rmi redis:latest
http://www.jsqmd.com/news/357263/

相关文章:

  • 你没用AI,但系统说你“不像人写的”?百考通「降重+降AI」,专治“好论文被算法误伤”
  • 冥想第一千七百八十七天(1787)
  • AI人类学工具在本地化测试中的文化偏见检测框架
  • 百考通一句话需求,一键生成专业问卷,让调研智能高效
  • Thymeleaf,现代化的Java服务器端模板引擎!
  • 技术日报|AI安全黑客Shannon横空出世狂揽3000+星登顶GitHub
  • 用过才敢说! 降AIGC网站 千笔·专业降AIGC智能体 VS 学术猹,MBA专属更高效
  • 人工智能应用- 语言处理:08.AI 作诗的局限与挑战
  • 1966-2025年低空经济企业数据库
  • 人工智能应用- 语言处理:01.机器翻译:人类语言的特点
  • 如何盘活闲置的京东e卡?回收唤醒沉睡资金! - 京顺回收
  • 导师又让重写?千笔,碾压级的降AI率网站
  • 2026年软件测试公众号高热内容解析与行动指南
  • 导师严选! 降AIGC平台 千笔 VS Checkjie,专科生专属高效之选
  • 多智能体一致性仿真:直观展示状态轨迹与控制输入,简易程序带注释,适合初学者入门
  • 内存模型和名称空间(名称空间)
  • 基于SpringBoot+Vue的高校器材管理系统的设计与实现
  • C++名称空间:解决命名冲突的终极武器
  • Week4-2026-02-08
  • 导师推荐 10个一键生成论文工具:本科生毕业论文+科研写作高效测评与推荐
  • 写作小白救星 9个一键生成论文工具测评:继续教育毕业论文+开题报告高效攻略
  • 【深度剖析】Kubernetes供应链攻击:恶意Helm Chart、Operator与CSI/CNI插件的攻防全景图
  • Flutter 与 OpenHarmony 通信:Flutter Channel 使用指南
  • 重要发布丨新增支持工作流知识库和数据源工具,MaxKB开源企业级智能体平台v2.4.0版本发布 - 详解
  • 去除前导 0 的经典代码
  • ‌大模型测试脚本生成器:基于GPT-5的跨语言自动化代码转换工具‌
  • 别让大模型“学废了”!从数据清洗到参数调优,一次讲透微调实战
  • XCVP1802-2MSILSVC4072 AMD Xilinx Versal Premium Adaptive SoC FPGA - 实践
  • 电子世界的奇妙冒险:03-2 同一道物理魔法,两种现代生活——电磁炉与无线充电的“热能”与“电能”变形记
  • 西科(盐城)表面涂层品牌吗,选购要点有哪些 - 工业设备