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
进程,关它的运行窗口或 killdocker attach
进程 docker run -t ...
启动的容器可用ctrl - c
断开docker attache
会话- 用
docker attach --sig-proxy=false
连接的会话也可用ctrl - c
断开(强烈选择它是因为不必理会容器是怎么启动的) - 用
docker run -it ...
启动的容器可用预置的ctrl - p, ctrl - q
断开会话