你如何附加和脱离Docker的过程?

时间:2013-10-30 16:20:14

标签: docker

我可以附加到docker进程,但是 Ctrl + c 无法从中分离。 exit基本上停止了这个过程。

建议的工作流程是什么,让流程运行,偶尔附加到它上面进行一些更改,然后分离?

14 个答案:

答案 0 :(得分:552)

要在不退出shell的情况下分离tty,请使用转义序列 Ctrl-p Ctrl-q

这里有更多细节: https://docs.docker.com/engine/reference/commandline/attach/

来自此来源的其他信息(https://groups.google.com/forum/#!msg/docker-user/nWXAnyLP9-M/kbv-FZpF4rUJ):

  • docker run -t -i→可以与^P^Q分离并使用docker attach重新附加
  • docker run -i→无法与^P^Q分离;将扰乱stdin
  • docker run→无法与^P^Q分离;可以SIGKILL客户端;可以用docker attach重新附加

答案 1 :(得分:161)

还可以查看the --sig-proxy option

docker attach --sig-proxy=false 304f5db405ec

然后使用CTRL+c分离

答案 2 :(得分:86)

如果您只想对文件进行一些修改或检查流程,可以选择另一种解决方案。

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

sudo docker exec -ti [CONTAINER-ID] bash

将使用bash shell启动一个新进程,您可以直接通过^c从中逃脱,它不会影响原始进程。

答案 3 :(得分:41)

我认为这应该取决于具体情况。以下面的容器为例:

# 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 + p + Ctrl + q 退出容器:

# 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

答案 4 :(得分:19)

要从正在运行的容器中分离,请使用 ^ P ^ Q (按住 Ctrl ,按 P ,按 Q < / kbd>,释放 Ctrl )。

有一个问题:只有在 -t-i启动容器时才有效。

如果您有一个在没有这些选项中的一个(或两个)的情况下启动的正在运行的容器,并且您附加了docker attach,那么您需要找到另一种分离方法。根据您选择的选项和正在运行的程序, ^ C 可能有效,或者它可能会终止整个容器。你必须进行实验。

另一个问题:根据您使用的程序,您的终端,shell,SSH客户端或多路复用器可能会拦截 ^ P ^ Q (通常是后者)。要测试这是否是问题,请尝试运行或附加--detach-keys z参数。您现在应该能够通过按 z 分离,而不使用任何修饰符。如果这有效,另一个程序正在干扰。解决此问题的最简单方法是使用--detach-keys参数set your own detach sequence。 (例如,要使用 ^ K 退出,请使用--detach-keys 'ctrl-k'。)或者,您可以尝试禁用终端或其他干扰程序中的密钥拦截。例如,stty start ''stty start undef可能会阻止终端拦截某些POSIX系统上的 ^ Q ,但我还没有发现这有用。

答案 5 :(得分:9)

我有同样的问题,ctrl-P和Q不起作用,也没有ctrl-C ...最终我打开了另一个终端会话,我做了#34; docker stop containerid &# 34;和#34; docker start containerid &#34;它完成了工作。怪异。

答案 6 :(得分:7)

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

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

$ docker container attach "container_name"

答案 7 :(得分:4)

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

答案 8 :(得分:2)

我在Mac上,由于某些原因, Ctrl - p Ctrl - q 只有在我还按住 Shift

时才能工作

答案 9 :(得分:1)

更新

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

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

原始答案

我想让容器继续运行,但是没有通过-it启动容器来进行连接。我的解决方案是牺牲我的SSH连接(因为我被SSH到运行容器的计算机中)。终止该ssh会话后,容器保持完整,但使我脱离了容器。

答案 10 :(得分:0)

  1. 打开一个新终端
  2. 找到正在运行的容器ID docker ps
  3. 杀死容器docker kill ${containerId}

答案 11 :(得分:0)

对于遇到我同样问题的任何人(即使设置了分离键,也不能在不杀死容器的情况下进行分离)……

使用docker-compose up -d

启动容器时

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

尝试docker-compose logs -f {service name} ctrl-c杀死日志尾巴而不会杀死您的容器

{service name}是在docker-compose.yml文件的侧面列出的服务。.(例如,容器名称= elk_logstash_1->服务名称= logstash

HTH

答案 12 :(得分:0)

如果您只需要在后台运行docker进程,则可以使用

Ctrl + Z

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

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

答案 13 :(得分:0)

我发现有关连接和分离的 documentation 有点复杂。

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

attachment behavior

它具有以下列含义:

  • -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 并且您可以更改连接选项)或从当前终端(但您不能更改连接选项)到容器的连接附加列;{ {1}})

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

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

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

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

<块引用>

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

但是我没有成功重现这个。