Docker attach 后断开时不退出容器

docker attach 可以连接上 Docker 容器的标准输入,输出和错误输出。比如 docker attach 连接后就能显示容器中用 ENTRYPOINT/CMD 启动进程的输出内容内容。想要断开会话连接怎么做呢?ctrl - c, 控制台是不再显示了,可以容器也被终止了,显然这是一个危险的操作。

ctrl - c 不仅仅关闭了 docker attach 本身,因为它的默认参数 --sig-proxytrue,所以 SIGKILL 信号同时传递到了 ENTRYPOINT/CMD 的 PID 1 的进程,所以形成了双杀的效果。我们来试一下

如果是在生产环境下,用 docker attach 连接下控制台看下输出,然后不小心像终止 tail -f 命令一样用 ctrl - c  退出,结果服务断了。所以更为小心的操作还是用 docker logsdocker 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 容器的方法主要有

  1. 暴力杀死 docker attach 进程,关它的运行窗口或 kill docker attach  进程
  2. docker run -t ... 启动的容器可用 ctrl - c 断开 docker attache  会话
  3. docker attach --sig-proxy=false 连接的会话也可用 ctrl - c 断开(强烈选择它是因为不必理会容器是怎么启动的)
  4. docker run -it ... 启动的容器可用预置的 ctrl - p, ctrl - q 断开会话 

链接:docker attach

类别: Docker. 标签: . 阅读(6). 订阅评论. TrackBack.
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x