我可以附加到docker进程,但是 Ctrl + c 无法从中分离。 exit
基本上停止了这个过程。
建议的工作流程是什么,让流程运行,偶尔附加到它上面进行一些更改,然后分离?
答案 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):
^P^Q
分离并使用docker attach重新附加^P^Q
分离;将扰乱stdin ^P^Q
分离;可以SIGKILL客户端;可以用docker attach重新附加答案 1 :(得分:161)
答案 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)
docker ps
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 有点复杂。
我尝试了不同的选项来启动一个容器并从另一个终端附加到它。下表总结了结果:
它具有以下列含义:
-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}})
分离取决于运行选项,可以通过三种方式完成:
--sig-proxy=true
并通过 docker run [-i|-t]
从另一个终端连接 -> 按 docker attach --sig-proxy=false CONT
Ctrl+C
并通过 docker run -it
从另一个终端连接 -> 按 docker attach
Ctrl+P Ctrl+Q
并通过 docker run -it
从另一个终端连接 -> 按 docker attach --no-stdin
(当然,您应该为命令提供其他必要的参数,例如容器名称或图像)
附言我用 Ctrl+C
和 -i
(只有其中之一)尝试了不同的场景,但没有得到行为上的差异。我看到@ken-cochrane 提供了以下内容:
docker run -i → 不能用 ^P^Q 分离;会破坏标准输入
但是我没有成功重现这个。