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

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


当前回答

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

其他回答

我用的是Mac电脑,出于某种原因,Ctrl-p Ctrl-q只有在按住Shift的时候才会起作用

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

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

其列含义如下:

-d -是docker run -d是否使用的选项 ——sig-proxy -是选项docker attach——sig-proxy=true|false used to not ——no-stdin -是docker attach[——no-stdin]用于not的选项 键- docker是否发送输入键到容器化的应用程序 ^C -当用户按Ctrl+C时会发生什么 ^P ^Q -当用户按下Ctrl+P Ctrl+Q时会发生什么

有一些发现:

attachment behavior doesn't depend on -d option but from -i and -t you can consider attach columns either a connection to a container from another terminal (e.g. docker attach --sig-proxy=false and you may vary connection options) or from the current terminal (but you can't vary connection options; --sig-proxy=true) detachment depends on running options and can be done in three ways: docker run [-i|-t] and connect from another terminal by docker attach --sig-proxy=false CONT -> press Ctrl+C docker run -it and connect from another terminal by docker attach -> press Ctrl+P Ctrl+Q docker run -it and connect from another terminal by docker attach --no-stdin -> press Ctrl+C

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

附注:我用-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(一个小写字母) @(@号) [(左括号) \(两个反斜杠) _(下划线) ^(脱字符号)

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

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

# 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

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

来自此来源的其他信息:

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