首页/云/云与容器速查/docker attach 接入容器主进程
容器与 Docker106 条

docker attach 接入容器主进程

把当前终端接到容器 PID 1 的标准输入输出:能观察输出、发送输入;但 Ctrl+C 会把信号转发给主进程,操作不当直接停服。进容器开 shell 应首选 exec。

云与容器速查云更新于 2026-10-13

docker attach 是什么

attach 把当前终端接到容器主进程(PID 1)的标准输入与输出上,能实时看输出、也能向程序发送输入,但它操作的是主进程本身,不是新开一个进程。默认开启信号转发,Ctrl+C 会把 SIGINT 直接送给主进程,很多服务因此被意外打停。需要进容器排查时应该优先用 exec,attach 只在确实要观察或与主进程交互时使用。

基本信息

语法docker attach [--detach-keys=...] [--sig-proxy=false] 容器
适用平台Docker/Podman 等支持 attach 的容器运行时,Linux 与 Windows 容器均可
分离键默认 Ctrl+P 再 Ctrl+Q,可用 --detach-keys 改成不冲突的组合
前置条件容器启动时需分配 stdin(-i 或 -it),否则连接后敲不进字
与 exec 区别attach 连的是现有主进程的 I/O,exec 在容器里另起一个新进程
信号风险--sig-proxy 默认开启,终端信号会被转发给主进程

典型使用场景

  • 观察前台进程的实时输出,确认程序是否在写标准输出
  • 向交互式程序发送输入,如需要确认或选择的一次性脚本
  • 验证容器是否真的收到标准输入,排查 stdin 相关的诡异行为
  • 排查“日志里什么都没有”的情况,判断是进程不输出还是日志被重定向
  • 理解 PID 1 与信号处理:确认应用是否正确接收并响应信号

使用示例

使用示例
docker run -dit --name app alpine sh   # 起一个分配了 stdin 的容器
docker attach --detach-keys="ctrl-a,d" app   # 把分离键改成 Ctrl-A 再按 d
docker attach --sig-proxy=false app   # 不把 Ctrl+C 转发给主进程
# 要退出时用分离键:Ctrl-A 然后按 d,不要按 Ctrl+C
docker logs -f app   # 只想看输出时用这个更安全
docker exec -it app sh   # 需要开 shell 时改用 exec

attach 与 exec 对照

维度docker attachdocker exec
连接对象容器现有主进程的输入输出容器内新起一个进程
是否影响服务会,输入与信号直接作用于主进程不会,退出只是新进程结束
前置条件容器需分配 stdin 且未关闭只要能执行到目标二进制
典型用途看输出、发输入、确认 stdin排查、跑诊断命令、开 shell
启动时没有分配 stdin 的容器,attach 上去只能看输出、敲不进字:这类容器排查请用 docker exec -it 另开一个 shell。
在 attach 的终端里按 Ctrl+C 不是“退出客户端”,而是给主进程发中断信号:生产容器上这一步可能直接停服。

易错点

  • attach 后按 Ctrl+C 想退出:SIGINT 被转发给主进程,服务被打停
  • 想开 shell 却用 attach:命令敲不进应用的输出流里,误以为容器卡死
  • 在 attach 终端里误输入字符:输入直接送进主进程,可能触发意外行为
  • 把 attach 当长期日志工具:容器重启后连接断开,之前的输出也无法回看
  • 对没有 stdin 的容器反复尝试 attach:看不到任何反馈,白白消耗排查时间

数据来源与参考

  • Docker Docs:docker attach

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌