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断开会话





