I can attach to a docker process but Ctrl+c doesn't work to detach from it. exit
basically halts the process.
What's the recommended workflow to have the process running, occasionally attaching to it to make some changes, and then detaching?
I can attach to a docker process but Ctrl+c doesn't work to detach from it. exit
basically halts the process.
What's the recommended workflow to have the process running, occasionally attaching to it to make some changes, and then detaching?
如果您只想对文件进行一些修改或检查进程,这里可能是您想要的另一种解决方案。
您可以运行以下命令从现有容器执行新进程:
sudo docker exec -ti [CONTAINER-ID] bash
Ctrl将使用 bash shell 启动一个新进程,您可以直接通过+退出它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:Ctrlq
# 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(hold Ctrl, press P, press Q, release 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 系统上,虽然我没有发现这有帮助。
when nothing else works, open a new terminal then:
$ 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"
我有同样的问题,ctrl-P并且Q无法工作,也ctrl- C...最终我打开了另一个终端会话,我做了“docker stop containerid ”和“docker start containerid ”,它完成了工作。诡异的。
在同一个外壳中,按住ctrl键然后p按键q
我通常使用 docker attach 来查看 STDOUT 显示的内容,以便对容器进行故障排除。我刚刚发现docker logs --follow 621a4334f97b
,它可以让我看到 STDOUT,同时还能在不影响容器操作的情况下按 ctrl+c 关闭它!正是我一直想要的。
...当然,您需要替换为您自己的容器 ID。
我想让容器继续运行,但没有使用-it
. 我的解决方案是牺牲我的 SSH 连接(因为我被 SSH 连接到运行容器的机器上)。终止该 ssh 会话使容器完好无损,但使我与它分离。
对于遇到同样问题的任何人(即使在设置分离键的情况下也无法在不杀死容器的情况下分离)......
启动容器时docker-compose up -d
而不是docker attach {container name}
用来查看拖尾日志....
try docker-compose logs -f {service name}
ctrl-c杀死日志尾部而不杀死你的容器
{service name}
作为您的 docker-compose.yml 文件中列出的服务.. (例如,当容器名称=elk_logstash_1 -> 服务名称=logstash
高温高压
我在 Mac 上,出于某种原因,Ctrl- p Ctrl-q只有在我还持有Shift
docker ps
docker kill ${containerId}
要停止 docker 进程并释放端口,首先使用ctrl-c离开容器,然后使用 docker ps 查找正在运行的容器列表。然后,您可以使用 docker container stop 停止该进程并释放其端口。您可以从 docker ps 命令中找到容器名称,该命令在名称列中给出名称。希望这能解决您的疑问....
如果 --sig-proxy=false 方法不起作用,那么您还可以使用以下方法更改转义序列:
docker attach --detach-keys="<sequence>" <container_name or id>
例如,我想使用“ctrl-c”分离容器,然后我可以使用以下方法附加容器:
docker attach --detach-keys="ctrl-c" <container_name or id>
的格式可以是字母 [aZ],也可以是 ctrl- 与以下任意组合:
有关更多信息,另请参阅 ->覆盖分离序列
我发现有关附加和分离的文档有点复杂。
我尝试了不同的选项来启动一个容器并从另一个终端附加到它。下表总结了结果:
它具有以下列含义:
-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
,您可以更改连接选项)或从当前终端(但您不能更改连接选项;--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
(当然,您应该为容器名称或图像等命令提供其他必要的参数)
PS我尝试了不同的场景-i
和-t
(只有其中一个),但没有得到行为上的差异。我看到@ken-cochrane 提供了以下内容:
docker run -i → 不能用 ^P^Q 分离;会破坏标准输入
但我没有成功重现这一点。
如果您只需要 docker 进程进入后台,您可以使用
Ctrl+Z
请注意,这不是真正的分离,它会带来性能损失。(您可以使用命令将其返回到前台bg
)。
如果您不再需要它,另一种选择是关闭您的终端。