如何从Docker's进程中附加和分离?

我可以附加到一个docker进程,但Ctrl+c不能从它分离。exit基本上停止了进程。

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

450307 次浏览

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

来自这个源的附加信息:

  • docker run -t -i→可以使用# eyz0分离,并使用docker attach重新连接
  • docker run -i→不能与^P^Q分离;将中断stdin
  • docker run→不能使用^P^Q分离;可以SIGKILL客户端;可以用docker attach重新连接吗

看看--sig-proxy选项:

docker attach --sig-proxy=false 304f5db405ec

然后使用CTRL+c来分离

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

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

# EYZ0

bash shell会启动一个新的进程,你可以直接用Ctrl+C来逃离它,这不会影响原来的进程。

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

# 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 +# EYZ0+

(2)使用docker exec

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

执行Ctrl+p +# EYZ0+退出容器:

# 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

然后再次登录容器,你会看到前面的docker exec命令中的bash进程仍然活跃(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

当没有其他工作,打开一个新的终端然后:

$ 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>

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

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

$ docker container attach "container_name"

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

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

我有同样的问题,ctrl-P不会工作,也不是ctrl-C…最终,我打开了另一个终端会话,我做了“docker stop containerid”和“docker start containerid”,它完成了工作。奇怪。

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

如果容器以这两个 -t-i开始,这里有一个陷阱:才有效。

如果您有一个正在运行的容器在启动时没有这些选项中的一个(或两个),并且您使用docker attach附加,那么您将需要找到另一种方法来分离。根据您选择的选项和正在运行的程序,C ^可能会工作,也可能会杀死整个容器。你得自己试验一下。

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

我在Mac上,由于某种原因,Ctrl-p Ctrl-只有在我也持有转变时才能工作

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

对于任何遇到与我相同问题的人(不能在不杀死容器的情况下分离,即使在设置分离键时)......

当使用docker-compose up -d启动容器时

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

尝试docker-compose logs -f {service name} ctrl-c在不杀死容器的情况下杀死日志尾部

{service name}是在docker-compose中列出的服务。yml文件. .# EYZ1

HTH

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

# eyz0 + # eyz1

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

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

更新

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

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

原来的答案

我想让容器继续运行,但是没有使用-it启动容器就附加了容器。我的解决方案是牺牲我的SSH连接(因为我被SSHed到运行容器的机器上)。关闭ssh会话使容器完好无损,但使我脱离了它。

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

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

附件行为

其列含义如下:

  • -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,你可以改变连接选项)或从当前终端(但你不能改变连接选项;# EYZ1)

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

    1. docker run [-i|-t]和从另一个终端通过docker attach --sig-proxy=false CONT ->新闻# EYZ2
    2. docker run -it和从另一个终端通过docker attach ->新闻# EYZ2
    3. docker run -it和从另一个终端通过docker attach --no-stdin ->新闻# EYZ2

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

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

docker run -i→不能与^P^Q分离;将中断stdin

但我没有成功地复制这个。

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

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

例如,我想使用&;ctrl-c"分离容器;然后我可以附加容器使用:

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

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

  • a-z(一个小写字母)
  • @(@号)
  • [(左括号)
  • \(两个反斜杠)
  • _(下划线)
  • ^(脱字符号)

更多信息请参见-># EYZ0