我可以附加到docker进程,但是Ctrl+ c不能与其分离。exit
基本上停止了这个过程。
建议使用什么工作流程来运行流程,偶尔将其附加以进行一些更改,然后分离?
xterm
,konsole
等方面的工作?它对我有用(我变得超脱)。
我可以附加到docker进程,但是Ctrl+ c不能与其分离。exit
基本上停止了这个过程。
建议使用什么工作流程来运行流程,偶尔将其附加以进行一些更改,然后分离?
xterm
,konsole
等方面的工作?它对我有用(我变得超脱)。
Answers:
要在不退出外壳的情况下分离tty,请使用转义序列Ctrl+ P后跟Ctrl+ Q。更多细节在这里。
此来源的其他信息:
^P^Q
与docker attach 分离并重新连接^P^Q
; 会破坏标准输入^P^Q
;可以SIGKILL客户端;可以使用docker attach重新附加"detachKeys": "ctrl-a,a"
在.docker / config.json文件或 --detach-keys "ctrl-a,a"
与附加等在命令行上
Ctrl + Z
不分离;它只是过程的背景。它与分离不同,并且会降低性能。
docker run -ti --sig-proxy=false busybox top
似乎不起作用,该过程被ctrl-c杀死了,但是从 docker run -t -sig-proxy=false busybox top
似乎开始起作用并启用了ctrl-c退出
Ctrl-c
也将停止容器。
如果您只想对文件进行一些修改或检查进程,那么这里可能就是您想要的另一种解决方案。
您可以运行以下命令从现有容器中执行新过程:
sudo docker exec -ti [CONTAINER-ID] bash
将使用bash shell启动一个新进程,您可以直接通过Ctrl+ 退出它C,这不会影响原始进程。
exec
不是吗。
我认为这应视情况而定,以以下容器为例:
# 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
要与正在运行的容器分离,请使用^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系统上,尽管我没有发现这有帮助。
如果没有其他作用,请打开一个新终端,然后:
$ 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>
-9
没必要。
docker attach
而不是其父对象来杀死它。
我遇到了同样的问题,并且ctrl- 无法正常工作,也-- 最终我打开了另一个终端会话,并执行了“ docker stop containerid ”和“ docker start containerid ”,并完成了工作。奇怪的。PQctrlC
--rm
标志启动容器,则此操作将无效。Ctrl+P
并Ctrl+Q
在您使用-it
标志启动容器时起作用。
我在Mac上,出于某种原因,Ctrl- p Ctrl- q只会工作,如果我还举行Shift
docker ps
docker kill ${containerId}