535

I can attach to a docker process but Ctrl+c doesn't work to detach from it. exit basically halts the process.

What's the recommended workflow to have the process running, occasionally attaching to it to make some changes, and then detaching?

4

17 回答 17

768

要在不退出 shell 的情况下分离 tty,请使用转义序列Ctrl+P后跟Ctrl+ Q。更多细节在这里

来自此来源的附加信息:

  • docker run -t -i → 可以^P^Q使用 docker attach 分离和重新附加
  • docker run -i → 不能用^P^Q;分离 会破坏标准输入
  • docker run → 不能用^P^Q;分离 可以 SIGKILL 客户端;可以使用 docker attach 重新附加
于 2013-10-30T16:52:08.930 回答
198

另请--sig-proxy查看选项

docker attach --sig-proxy=false 304f5db405ec

然后使用CTRL+c分离

于 2014-04-06T12:35:29.780 回答
110

如果您只想对文件进行一些修改或检查进程,这里可能是您想要的另一种解决方案。

您可以运行以下命令从现有容器执行新进程:

sudo docker exec -ti [CONTAINER-ID] bash

Ctrl将使用 bash shell 启动一个新进程,您可以直接通过+退出它C,它不会影响原始进程。

于 2015-06-18T05:22:40.813 回答
53

我认为这应该视情况而定。以以下容器为例:

# docker run -it -d ubuntu
91262536f7c9a3060641448120bda7af5ca812b0beb8f3c9fe72811a61db07fc
# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
91262536f7c9        ubuntu              "/bin/bash"         5 seconds ago       Up 4 seconds                            serene_goldstine

(1) 使用“ docker attach”连接容器:

由于“ docker attach不会分配新的tty,而是重用原来正在运行的tty,所以如果运行exit命令,会导致正在运行的容器退出:

# docker attach 91262536f7c9
exit
exit
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
91262536f7c9        ubuntu              "/bin/bash"         39 minutes ago      Exited (0) 3 seconds ago                       serene_goldstine

所以除非你真的想让正在运行的容器退出,你应该使用Ctrl+ p+ Ctrl+ q

(2) 使用“ docker exec

由于 " docker exec"分配一个新的 tty,所以我认为你应该使用exit而不是Ctrl+ p+ Ctrl+ q

下面是执行Ctrl++退出容器 pCtrlq

# docker exec -it 91262536f7c9 bash
root@91262536f7c9:/# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  18160  1908 ?        Ss+  04:03   0:00 /bin/bash
root        15  0.0  0.0  18164  1892 ?        Ss   04:03   0:00 bash
root        28  0.0  0.0  15564  1148 ?        R+   04:03   0:00 ps -aux
root@91262536f7c9:/# echo $$
15

然后再次登录容器,您会看到bash上一条命令中的进程docker exec仍然存在(PID 为 15):

# docker exec -it 91262536f7c9 bash
root@91262536f7c9:/# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  18160  1908 ?        Ss+  04:03   0:00 /bin/bash
root        15  0.0  0.0  18164  1892 ?        Ss+  04:03   0:00 bash
root        29  0.0  0.0  18164  1888 ?        Ss   04:04   0:00 bash
root        42  0.0  0.0  15564  1148 ?        R+   04:04   0:00 ps -aux
root@91262536f7c9:/# echo $$
29
于 2016-02-24T02:11:02.277 回答
51

要从正在运行的容器中分离,请使用^P^Q(hold Ctrl, press P, press Q, release Ctrl)。

有一个问题:这仅在容器以 和 启动时才 -t有效-i

如果您有一个在没有这些选项中的一个(或两个)的情况下启动的正在运行的容器,并且您使用 附加docker attach,则需要找到另一种分离方式。根据您选择的选项和正在运行的程序,^C可能会工作,也可能会杀死整个容器。你必须进行实验。

另一个问题:根据您使用的程序,您的终端、shell、SSH 客户端或多路复用器可能正在拦截^P^Q(通常是后者)。要测试这是否是问题,请尝试运行或附加--detach-keys z参数。您现在应该可以按 分离z,无需任何修饰符。如果这有效,则另一个程序正在干扰。解决此问题的最简单方法是使用参数设置您自己的分离序列--detach-keys。(例如,要使用 退出,请^K使用--detach-keys 'ctrl-k'。)或者,您可以尝试禁用对终端或其他干扰程序中的键的拦截。例如,stty start ''stty start undef可能阻止终端拦截^Q在一些 POSIX 系统上,虽然我没有发现这有帮助。

于 2018-03-12T00:22:12.070 回答
32

when nothing else works, open a new terminal then:

$ ps aux | grep attach
username  <pid_here>    ..............  0:00 docker attach <CONTAINER_HASH_HERE>
username  <another_pid> ..............  0:00 grep --color=auto attach
$ kill -9 <pid_here>
于 2017-05-11T14:22:24.730 回答
11

要从容器中分离,您只需按住Ctrl并按P+ Q

要附加到正在运行的容器,请使用:

$ docker container attach "container_name"
于 2017-07-24T08:18:41.530 回答
9

我有同样的问题,ctrl-P并且Q无法工作,也ctrl- C...最终我打开了另一个终端会话,我做了“docker stop containerid ”和“docker start containerid ”,它完成了工作。诡异的。

于 2017-10-17T15:56:05.010 回答
3

在同一个外壳中,按住ctrl键然后p按键q

于 2017-09-06T07:58:04.450 回答
3

更新

我通常使用 docker attach 来查看 STDOUT 显示的内容,以便对容器进行故障排除。我刚刚发现docker logs --follow 621a4334f97b,它可以让我看到 STDOUT,同时还能在不影响容器操作的情况下按 ctrl+c 关闭它!正是我一直想要的。

...当然,您需要替换为您自己的容器 ID。

原始答案

我想让容器继续运行,但没有使用-it. 我的解决方案是牺牲我的 SSH 连接(因为我被 SSH 连接到运行容器的机器上)。终止该 ssh 会话使容器完好无损,但使我与它分离。

于 2020-05-29T20:43:12.137 回答
2

对于遇到同样问题的任何人(即使在设置分离键的情况下也无法在不杀死容器的情况下分离)......

启动容器时docker-compose up -d

而不是docker attach {container name}用来查看拖尾日志....

try docker-compose logs -f {service name} ctrl-c杀死日志尾部而不杀死你的容器

{service name}作为您的 docker-compose.yml 文件中列出的服务.. (例如,当容器名称=elk_logstash_1 -> 服务名称=logstash

高温高压

于 2019-10-10T16:09:19.407 回答
1

我在 Mac 上,出于某种原因,Ctrl- p Ctrl-q只有在我还持有Shift

于 2019-06-04T13:57:46.353 回答
1
  1. 打开一个新的终端
  2. 查找正在运行的容器 IDdocker ps
  3. 杀死容器docker kill ${containerId}
于 2019-09-29T18:48:16.463 回答
0

要停止 docker 进程并释放端口,首先使用ctrl-c离开容器,然后使用 docker ps 查找正在运行的容器列表。然后,您可以使用 docker container stop 停止该进程并释放其端口。您可以从 docker ps 命令中找到容器名称,该命令在名称列中给出名称。希望这能解决您的疑问....

于 2017-08-12T09:13:36.880 回答
0

如果 --sig-proxy=false 方法不起作用,那么您还可以使用以下方法更改转义序列:

docker attach --detach-keys="<sequence>" <container_name or id> 

例如,我想使用“ctrl-c”分离容器,然后我可以使用以下方法附加容器:

docker attach --detach-keys="ctrl-c" <container_name or id>

的格式可以是字母 [aZ],也可以是 ctrl- 与以下任意组合:

  • az(单个小写字母字符)
  • @(在符号处)
  • [(左括号)
  • \(两个反斜杠)
  • _(下划线)
  • ^(插入符号)

有关更多信息,另请参阅 ->覆盖分离序列

于 2021-12-04T16:21:15.843 回答
0

我发现有关附加和分离的文档有点复杂。

我尝试了不同的选项来启动一个容器并从另一个终端附加到它。下表总结了结果:

依恋行为

它具有以下列含义:

  • -d- 是否使用docker run -d选项
  • --sig-proxy- 是docker attach --sig-proxy=true|false过去不使用的选项
  • --no-stdin- 是docker attach [--no-stdin]过去不使用的选项
  • keys- docker 是否将输入键发送到容器化应用程序
  • ^C- 当用户按下时发生了什么Ctrl+C
  • ^P ^Q- 当用户按下时发生了什么Ctrl+P Ctrl+Q

有几个发现:

  • 依恋行为不依赖于-d选项,而是来自-i-t

  • 您可以考虑将列附加到从另一个终端连接到容器(例如docker attach --sig-proxy=false,您可以更改连接选项)或从当前终端(但您不能更改连接选项;--sig-proxy=true

  • 分离取决于运行选项,可以通过三种方式完成:

    1. docker run [-i|-t]docker attach --sig-proxy=false CONT并通过-> 按从另一个终端连接Ctrl+C
    2. docker run -itdocker attach并通过-> 按从另一个终端连接Ctrl+P Ctrl+Q
    3. docker run -itdocker attach --no-stdin并通过-> 按从另一个终端连接Ctrl+C

(当然,您应该为容器名称或图像等命令提供其他必要的参数)

PS我尝试了不同的场景-i-t(只有其中一个),但没有得到行为上的差异。我看到@ken-cochrane 提供了以下内容:

docker run -i → 不能用 ^P^Q 分离;会破坏标准输入

但我没有成功重现这一点。

于 2021-08-10T16:23:34.483 回答
-2

如果您只需要 docker 进程进入后台,您可以使用

Ctrl+Z

请注意,这不是真正的分离,它会带来性能损失。(您可以使用命令将其返回到前台bg)。

如果您不再需要它,另一种选择是关闭您的终端。

于 2019-11-12T16:11:35.137 回答