Docker容器Ctrl+P快捷键说明

Docker容器Ctrl+P快捷键说明

Docker attach 中的 C-p 快捷键

作用原理

  • Docker detach 序列默认是 =C-p C-q=,**不是单独 C-p**
  • 生效场景:=docker attach=(带 -it);=docker exec= 默认不捕获该快捷键
  • 工作流程

    1. 按下 C-p:Docker CLI 拦截,进入等待下一个按键状态
    2. 紧接着 C-q:脱离容器终端,容器进程继续运行,返回宿主机shell
  • 冲突点:Linux shell原生 C-p 是调取上一条历史命令;attach模式下被Docker截获,shell收不到按键

> 区分: > - =C-c=:发送 SIGINT,终止容器内进程 > - =C-p C-q=:仅断开终端连接,容器继续运行

修改 / 规避该快捷键

Docker 不能直接关闭 detach-keys,设置**双按键序列**提升门槛,防止误操作。 > ⚠️ 按键选择原则:避开 Emacs 常用快捷键(C-x/C-a/C-e/C-f/C-b/C-n/C-p/C-s/C-r/C-w/C-y/C-h/C-g) > 推荐脱离序列:=ctrl-\,ctrl-]= > 触发方式:先按 C-\,松开,紧接着按 C-],才会脱离容器。两个按键在 Emacs 日常编辑几乎不会用到,无冲突。

单次命令指定(临时生效)
1
2
3
4
5
# attach 自定义双按键脱离序列
docker attach --detach-keys="ctrl-\,ctrl-]" 容器名/ID

# run 创建容器预先指定
docker run -it --detach-keys="ctrl-\,ctrl-]" ubuntu bash
全局客户端配置 ~/.docker/config.json
1
2
3
{
  "detachKeys": "ctrl-\\,ctrl-]"
}

> ✅ 注意:json字符串内反斜杠需要转义,写 ctrl-\\ > ✅ 重要:此文件是 Docker CLI客户端配置,不是dockerd服务配置 > 修改后 **不需要重启Docker服务**;新打开终端 / 新执行 docker attach 立即生效。 > ⚠️ 已经attach的旧会话不会自动更新,需要退出后重新attach。 > 语法说明:多按键用逗号分隔,最多2个;不再拦截C-p,shell原生C-p恢复正常。

推荐最佳实践

> 优先使用 docker exec -it 容器 bash 进入容器。 > exec 模式默认不启用 detach 转义序列,shell C-p/C-n 快捷键完全正常。 > docker attach 仅用于查看容器主进程日志。

一键修改 ~/.docker/config.json 的脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/bin/bash
# 设置detachKeys为 ctrl-\,ctrl-],双按键防误触,避开Emacs常用快捷键,释放C-p
DOCKER_CONF="$HOME/.docker/config.json"
mkdir -p "$HOME/.docker"
if [ -f "$DOCKER_CONF" ]; then
  jq '. + {"detachKeys":"ctrl-\\,ctrl-]"}' "$DOCKER_CONF" > "${DOCKER_CONF}.tmp" && mv "${DOCKER_CONF}.tmp" "$DOCKER_CONF"
else
  echo '{"detachKeys":"ctrl-\\,ctrl-]"}' > "$DOCKER_CONF"
fi
echo "完成,已设置全局docker detachKeys=ctrl-\\,ctrl-]"

验证配置是否生效

1
2
# 查看docker cli配置,确认detachKeys
cat ~/.docker/config.json

测试新脱离快捷键

1
2
# 启动测试容器
docker run -it --rm --detach-keys="ctrl-\,ctrl-]" ubuntu bash

操作:进入容器后,先后按下 C-\ 然后 C-],终端脱离回到宿主机。 > 注意:必须连续按这两个组合键;单独按任意一个不会触发脱离。

总结要点

  • C-p 是 docker attach 脱离序列的首按键,单独按下不会脱离容器,但会劫持shell原生C-p。
  • 优先改用 docker exec,从根源避开快捷键冲突。
  • 修改 ~/.docker/config.json:**无需重启docker服务**,新cli会话生效;旧attach会话需重连。
  • 新脱离序列 =ctrl-\,ctrl-]=:双按键触发,避开Emacs日常快捷键,大幅降低误触概率。

参考链接

https://www.doubao.com/thread/xJ4lYdCmJ0Z4ickoE