我可以附加到一个docker进程,但Ctrl+C不能从它分离。退出基本上停止了进程。
让流程运行,偶尔附加到流程上进行一些更改,然后再分离的推荐工作流是什么?
我可以附加到一个docker进程,但Ctrl+C不能从它分离。退出基本上停止了进程。
让流程运行,偶尔附加到流程上进行一些更改,然后再分离的推荐工作流是什么?
要在不退出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重新连接吗
如果您只是想对文件进行一些修改或检查进程,这里有另一个您可能需要的解决方案。
您可以运行以下命令从现有容器中执行一个新进程:
sudo docker exec -ti [CONTAINER-ID] bash
用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 + 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
当没有其他工作,打开一个新的终端然后:
$ 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 + Q。
附加到你使用的正在运行的容器:
$ docker container attach "container_name"
要停止一个docker进程并释放端口,首先使用ctrl-c退出容器,然后使用docker ps找到正在运行的容器列表。然后,您可以使用docker容器stop来停止该进程并释放其端口。容器名可以从docker ps命令中找到,该命令在name列中给出了名称。希望这解决了您的疑问....
我有同样的问题,Ctrl+P和Q不能工作,也不是Ctrl+C…最终,我打开了另一个终端会话,我做了“docker stop containerid”和“docker start containerid”,它完成了工作。奇怪。
要从正在运行的容器中分离,请使用^P^Q(按住Ctrl,按P,按Q,释放Ctrl)。
这里有一个问题:这只在容器同时以-t和-i开始时才有效。
如果你有一个正在运行的容器,启动时没有这些选项中的一个(或两个),并且你使用docker attach附加,你需要找到另一种方法来分离。^C可以工作,也可以杀死整个容器,这取决于你选择的选项和正在运行的程序。你得自己试验一下。
Another catch: Depending on the programs you're using, your terminal, shell, SSH client, or multiplexer could be intercepting either ^P or ^Q (usually the latter). To test whether this is the issue, try running or attaching with the --detach-keys z argument. You should now be able to detach by pressing z, without any modifiers. If this works, another program is interfering. The easiest way to work around this is to set your own detach sequence using the --detach-keys argument. (For example, to exit with ^K, use --detach-keys 'ctrl-k'.) Alternatively, you can attempt to disable interception of the keys in your terminal or other interfering program. For example, stty start '' or stty start undef may prevent the terminal from intercepting ^Q on some POSIX systems, though I haven't found this to be helpful.
对于任何遇到与我相同问题的人(不能在不杀死容器的情况下分离,即使在设置分离键时)......
当使用docker-compose up -d启动容器时
而不是使用docker附加{容器名}来查看尾矿日志....
Ctrl+C在不杀死容器的情况下杀死日志尾部
{服务名}是在docker-compose中列出的服务。yml文件. .(例如,当容器名称=elk_logstash_1 ->服务名称=logstash
如果你只需要docker进程在后台运行,你可以使用
Ctrl + Z
注意,这不是一个真正的分离,它会带来性能损失。 (您可以使用bg命令将其返回到前台)。
另一种选择是关闭你的终端,如果你不再需要它。
更新
我通常使用docker attach来查看STDOUT显示的内容,以便对容器进行故障排除。我刚刚发现码头日志-遵循621a4334f97b,这让我看到STDOUT,同时也能够ctrl+c关闭它,而不影响容器操作!这正是我一直想要的。
... 当然,你需要替换你自己的容器ID。
原来的答案
我想让容器运行,但是没有使用-it启动容器。我的解决方案是牺牲我的SSH连接(因为我被SSHed到运行容器的机器上)。关闭ssh会话使容器完好无损,但使我脱离了它。
我发现关于附加和分离的文档有点复杂。
我尝试了不同的选项来启动一个容器并从另一个终端连接到它。下表总结了结果:
其列含义如下:
-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(一个小写字母) @(@号) [(左括号) \(两个反斜杠) _(下划线) ^(脱字符号)
有关更多信息,请参见->覆盖分离序列