docker attach
可以连接上 Docker 容器的标准输入,输出和错误输出。比如
docker attach
连接后就能显示容器中用 ENTRYPOINT/CMD 启动进程的输出内容内容。想要断开会话连接怎么做呢?
ctrl - c
, 控制台是不再显示了,可以容器也被终止了,显然这是一个危险的操作。
ctrl - c
不仅仅关闭了
docker attach
本身,因为它的默认参数
--sig-proxy
是
true
,所以
SIGKILL
信号同时传递到了 ENTRYPOINT/CMD 的 PID 1 的进程,所以形成了双杀的效果。我们来试一下
如果是在生产环境下,用
docker attach
连接下控制台看下输出,然后不小心像终止
tail -f
命令一样用
ctrl - c
退出,结果服务断了。所以更为小心的操作还是用
docker logs
。
docker attach
的优势只是在于能查看实时的控制台输出。
不想关闭容器的话,千万不要用
ctrl - c
, 那么有什么办法只断开
docker attach
而不退出容器呢?
一:关闭执行
docker attach
终端窗口
是不是太土了,这样做只会影响到
docker attach
进程本身,如果
docker attach
连接的是远端的 docker 容器,关闭电脑都行。只要不像对应 docker 容器发送终止信号
二:杀死
docker attach
对应的进程
这需要两个终端窗口(或者 tmux) 来配合,
docker attach
后,开一个新的窗口找到
docker attach
进程,然后 kill 它。这种操作实质上与关闭
docker attach
所在窗口是一样的。
三:
--sig-proxy=false
,直接 ctrl + c
也两种方式也许会令人觉得不太正经的方式,那么用
docker attach --sig-proxy=false
连接会话后,再用
ctrl - c
终止
docker attach
就显得优雅许多了
docker attach
的
--sig-proxy
参数默认为
true
,就是对
docker attach
发送的信号会代理给容器内的
PS 1
进程。
--sig-proxy=false
就不会转发该信号给容器内的进程了。
四:只用
-t
启动的容器也能 ctrl - c
如果启动容器时只用了
-t
参数,不能有
-i
,
docker attach
后直接
ctrl - c
退出会话也不会关闭相应的容器。因为
docker attach
连接
-t
启动的容器禁用了它的标准输入,所以也接收不到
SIGKILL
信号。下面还有话说
五:
-it
的容器可用
ctrl-p, ctrl-q
退出
docker attach
这个要求有点高,都使用了
-i
和
-t
来启动容器,对于
docker attach
的需求就不那么的高,除非多个终端同时监控 docker 容器中的会话。所以
ctrl-p, ctrl-q
的操作方式也需要在另一个窗口中进行
在下面的窗口按下
ctrl-p, ctrl-q
后显示
read escape sequence
只退出
docker attach
进程而不影响 docker 容器。
docker attach
还能用
--detach-keys
重定义断开会话的快捷键,用以替换标准的
ctrl-p, ctrl-q
。
--no-stdin
不让
docker attach
连接标准输入,但却阻挡不了
ctrl - c
结束
docker attach
时同时消灭了相应的容器。
小结一下,断开
docker attach
会话而不关闭 docker 容器的方法主要有
暴力杀死
docker attach
进程,关它的运行窗口或 kill
docker attach
进程
docker run -t ...
启动的容器可用
ctrl - c
断开
docker attache
会话
用
docker attach --sig-proxy=false
连接的会话也可用
ctrl - c
断开(强烈选择它是因为不必理会容器是怎么启动的)
用
docker run -it ...
启动的容器可用预置的
ctrl - p, ctrl - q
断开会话
链接:
docker attach
本文链接
https://yanbin.blog/docker-attach-deattach-without-exit-container/
, 来自
隔叶黄莺 Yanbin Blog
[版权声明]
本文采用
署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
进行许可。
最新评论