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

Mar*_*rkL 418 docker

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

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

Ken*_*ane 616

要在不退出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重新附加

  • ^ P,^ Q对我不起作用.^ P只是在屏幕上打印. (269认同)
  • 如果它实际上如文档中所描述的那样工作,那将是一个很好的答案. (42认同)
  • 我发现即使使用-it运行,如果您还使用清除标志(--rm)启动容器,则分离序列将失败.对某些人来说这可能是显而易见的,但它比我想承认的更频繁地咬我. (19认同)
  • 另一种选择是关闭终端窗口或cmd-w :) (7认同)
  • `Ctrl + Z`不分离; 它只是背景的过程.它与分离和性能损失不同. (4认同)
  • 默认情况下,^q 用于启动(恢复)由 ^s 暂停的终端输出。要将 ^q 用于其他目的(例如 docker),您必须取消设置它。你可以用 `stty start ""` 来做到这一点,这应该可以为所有 ^p^q 不起作用的人解决这个问题。 (3认同)
  • 您可以使用.docker / config.json文件中的`“ detachKeys”:“ ctrl-a,a”`或命令行中的`--detach-keys“ ctrl-a,a”`来设置可配置的分离键。附加等 (2认同)

cze*_*asz 168

退房还--sig-proxy选项:

docker attach --sig-proxy=false 304f5db405ec
Run Code Online (Sandbox Code Playgroud)

然后CTRL+c用来分离

  • 为了尝试从run而不是attach开始,我试过:`docker run -ti --sig-proxy = false busybox top`这似乎不起作用,进程被ctrl-c杀死但是以`docker run -t开头-sig-proxy = false busybox top`似乎正常工作并启用了使用ctrl-c退出 (4认同)

Col*_* Su 90

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

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

sudo docker exec -ti [CONTAINER-ID] bash

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

  • 这很有效,您可以在完成后输入"退出",而不会影响原始流程. (6认同)
  • “attach”对于 Docker 有特定的含义,而“exec”则不是。 (2认同)

Nan*_*iao 44

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

# 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
Run Code Online (Sandbox Code Playgroud)

(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
Run Code Online (Sandbox Code Playgroud)

所以除非你真的想让运行容器退出,否则你应该使用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
Run Code Online (Sandbox Code Playgroud)

然后再次登录容器,您将看到bashpreavious 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
Run Code Online (Sandbox Code Playgroud)


Zen*_*xer 30

要从正在运行的容器中分离,请使用^P^Q(按住Ctrl,按P,按Q,释放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系统,尽管我没有发现这有用.

  • 超级精确的解释,就像魅力一样 (2认同)

Adi*_*tol 25

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

$ 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>
Run Code Online (Sandbox Code Playgroud)


小智 10

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

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

$ docker container attach "container_name"
Run Code Online (Sandbox Code Playgroud)


Pie*_*tto 9

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


Cen*_*bit 6

更新

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

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

原答案

我想让容器保持运行,但已附加但未使用 启动容器-it。我的解决方案是牺牲我的 SSH 连接(因为我通过 SSH 连接到运行容器的机器)。终止该 ssh 会话使容器完好无损,但使我与它分离。