Docker 容器具有交互模式,可让您将终端的输入和输出流附加到容器的进程。按 Ctrl-C 通常会终止该
进程,导致容器停止。这是在不停止容器的情况下从会话中分离。
不停地分离
Docker 支持使用键盘组合从容器中优雅地分离。按 Ctrl-P,然后按 Ctrl-Q,以断开连接。
您将返回到您的 shell,但之前附加的进程将保持活动状态,让您的容器保持运行。您可以通过使用docker ps
获取正在运行的容器列表来检查这一点。
exit
除非经过特殊配置,否则按 Ctrl-C 或运行命令通常会终止容器的前台进程。一个 Docker 容器需要有一个正在运行的前台进程;没有容器的容器将进入停止状态。
更改分离键盘顺序
您可以更改分离顺序以匹配您的偏好或避免与您的应用程序支持的键盘快捷键发生冲突。detachKeys
向~/.docker/config.json
文件中添加一个属性以指定要使用的键。
Docker 支持a-z
字符 and @
、^
、 and _
、 符号,以及左括号符号 ( [
) 和两个反斜杠 ( \\
)。这些都是和Ctrl-
key一起使用的;字母也可以单独使用,不用Ctrl
.
键序列表示为逗号分隔的列表:
{
"detachKeys": "Ctrl-d,d"
}
当您Ctrl-D
立即按下该d
键时,此示例将与容器分离。
在每个容器的基础上更改顺序
除了更改全局配置之外,Docker 还接受detachKeys
基于每个容器和每个附件的覆盖。将--detach-keys
标志添加到可以附加到容器进程以设置特定序列的命令。
支持这一点的命令是:
docker run
docker start
docker exec
docker attach
以下是如何附加到容器,然后使用Ctrl-d
,后跟下划线,以分离:
码头工人附加我的容器 --detach-keys="Ctrl-d,_"
该--detach-keys
标志使用与detachKeys
配置选项相同的键序列格式。该标志会覆盖您的docker.json
设置;这反过来会覆盖 Docker 的默认 Ctrl-P/Ctrl-Q 序列。
当键盘序列不起作用时分离
有时您可能会遇到拒绝分离的容器进程,即使您发出键盘序列也是如此。如果容器的输入流未连接到您的终端(-i
标志)或者它没有分配伪 TTY(-t
标志),就会发生这种情况。如果您的容器进程处理分离键序列并且您在附加时没有覆盖它,您也可能会遇到此问题。
在这些情况下,仍然可以将终端与容器分离。您需要临时打开另一个 shell 窗口并使用它来终止docker.attach
使附件保持活动状态的进程。
首先找到附件进程的进程ID:
ps -ef | grep 附加
使用来自的输出ps
来确定docker.attach
您需要终止的进程。CMD
列中的命令应标识您要查找的附件。记下相关的 PID 号并使用kill
命令终止此进程:
kill -9 <PID>
您应该会看到原始 shell 与 Docker 容器分离并恢复到正常操作状态。您现在可以关闭第二个外壳并继续使用原始外壳。
这种技术的工作原理是杀死将终端连接到容器的 Docker CLI 进程,而不是容器内保持它运行的进程。您的原始终端再次可用并且容器保持运行状态。
重新连接到您的容器
您可以使用该docker attach
命令重新附加到容器。这会自动将终端的输入、输出和错误流附加到指定的容器:
docker 附加我的容器
默认情况下,所有三个流都已连接。您可以通过传递--no-stdin
标志来省略输入流。容器的输出将流式传输到您的终端,但您将无法提供任何输入。
再次使用键盘序列分离或Ctrl-C
停止进程和容器。如果您使用Ctrl-C
或exit
,docker attach
将$?
在您的 shell 中正确设置变量,以便您可以检查容器的退出代码。
概括
从 Docker 容器分离的正确方法是一个相当模糊的键盘序列,它会让你回到你的 shell。您可以自定义此序列以增加记忆力并避免与容器的键盘处理发生任何冲突。
在某些情况下,键盘分离序列可能无效。通过识别和终止支持附件的进程,仍然可以从容器中分离。在这种情况下应该使用常规的 Unix 命令,例如ps
和kill
。
最后,如果您希望容器永久分离,请使用-d
标志 ( docker run -d my-image:latest
)启动它。这会将容器直接发送到后台,并且不会向您的 shell 发出任何输出。使用该docker ps
命令始终可以看到分离的容器,并且可以使用 停止docker stop my-container
。
未经允许不得转载:表盘吧 » 如何在不停止的情况下从 Docker 容器中分离