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