Docker 容器附加

描述将本地标准输入、输出和错误流附加到正在运行的容器
用法docker container attach [OPTIONS] CONTAINER
别名
docker attach

描述

docker attach附加终端的标准输入、输出和错误 (或三者的任意组合)到正在运行的容器中,使用容器的 ID 或名称。这使您可以查看其输出或以交互方式控制它,如 尽管这些命令直接在您的终端中运行。

注意

attach命令显示容器的ENTRYPOINTCMD过程。这可能看起来像 attach 命令已挂起,而实际上 该进程可能只是在那时没有写入任何输出。

您可以同时多次附加到同一个包含的进程。 从 Docker 主机上的不同会话。

要停止容器,请使用CTRL-c.此键序列发送SIGKILL到 容器。如果--sig-proxy为 true(默认值)、CTRL-c发送SIGINT自 容器。如果容器是使用-i-t,您可以从 容器中,并使用CTRL-p CTRL-q键序列。

注意

在容器内作为 PID 1 运行的进程由 Linux:它使用 default作忽略任何信号。所以,这个过程 不终止于SIGINTSIGTERM除非它被编码为这样做。

您不能重定向docker attach命令,而 附加到启用了 TTY 的容器(使用-i-t选项)。

当客户端连接到容器的stdiodocker attach, Docker 使用 ~1MB 内存缓冲区来最大化应用程序的吞吐量。 一旦此缓冲区已满,API 连接的速度就会受到影响,因此 这会影响 output 进程的写入速度。这与其他 像 SSH 这样的应用程序。因此,不建议运行 在 前台通过慢速客户端连接。相反,请使用docker logs命令来访问日志。

选项

选择违约描述
--detach-keys覆盖用于分离容器的键序列
--no-stdin不要附加 STDIN
--sig-proxytrue将所有接收到的信号代理到进程

例子

附加到正在运行的容器和从中运行的容器分离

以下示例启动一个正在运行的 Alpine 容器top在 detached 模式下, 然后附着在容器上;

$ docker run -d --name topdemo alpine top -b

$ docker attach topdemo

Mem: 2395856K used, 5638884K free, 2328K shrd, 61904K buff, 1524264K cached
CPU:   0% usr   0% sys   0% nic  99% idle   0% io   0% irq   0% sirq
Load average: 0.15 0.06 0.01 1/567 6
  PID  PPID USER     STAT   VSZ %VSZ CPU %CPU COMMAND
    1     0 root     R     1700   0%   3   0% top -b

由于容器是在没有-i-toptions 时,信号是 forwarded 到附加的进程,这意味着默认的CTRL-p CTRL-qDetach 键序列不会产生任何效果,但按CTRL-c终止 容器:

<...>
  PID  PPID USER     STAT   VSZ %VSZ CPU %CPU COMMAND
    1     0 root     R     1700   0%   7   0% top -b
^P^Q
^C

$ docker ps -a --filter name=topdemo

CONTAINER ID   IMAGE     COMMAND    CREATED          STATUS                       PORTS     NAMES
96254a235bd6   alpine    "top -b"   44 seconds ago   Exited (130) 8 seconds ago             topdemo

重复上面的示例,但这次使用-i-t选项集;

$ docker run -dit --name topdemo2 alpine /usr/bin/top -b

现在,当附加到容器时,按CTRL-p CTRL-q(“读取 escape 序列“),Docker CLI 正在处理分离序列,而attach命令与容器分离。检查容器的状态 跟docker ps显示容器仍在后台运行:

$ docker attach topdemo2

Mem: 2405344K used, 5629396K free, 2512K shrd, 65100K buff, 1524952K cached
CPU:   0% usr   0% sys   0% nic  99% idle   0% io   0% irq   0% sirq
Load average: 0.12 0.12 0.05 1/594 6
  PID  PPID USER     STAT   VSZ %VSZ CPU %CPU COMMAND
    1     0 root     R     1700   0%   3   0% top -b
read escape sequence

$ docker ps -a --filter name=topdemo2

CONTAINER ID   IMAGE     COMMAND    CREATED          STATUS          PORTS     NAMES
fde88b83c2c2   alpine    "top -b"   22 seconds ago   Up 21 seconds             topdemo2

获取容器命令的退出代码

在第二个示例中,您可以看到bash进程由docker attach命令也传递给其调用者:

$ docker run --name test -dit alpine
275c44472aebd77c926d4527885bb09f2f6db21d878c75f0a1c212c03d3bcfab

$ docker attach test
/# exit 13

$ echo $?
13

$ docker ps -a --filter name=test

CONTAINER ID   IMAGE     COMMAND     CREATED              STATUS                       PORTS     NAMES
a2fe3fd886db   alpine    "/bin/sh"   About a minute ago   Exited (13) 40 seconds ago             test

覆盖分离序列 (--detach-keys)

使用--detach-keys选项覆盖 Docker 键序列以进行分离。 如果 Docker 默认序列与键序列冲突,这非常有用 用于其他应用程序。有两种方法可以定义您自己的 detach key sequence 作为每个容器的覆盖或作为 整个配置。

要覆盖单个容器的顺序,请使用--detach-keys="<sequence>"flag 替换为docker attach命令。格式 这<sequence>是字母 [a-Z],或者ctrl-与任何 以下内容:

  • a-z(单个小写字母字符)
  • @(签到)
  • [(左括号)
  • \\(两个反斜杠)
  • _(下划线)
  • ^(插入符号)

这些a,ctrl-a,Xctrl-\\values 都是 valid key 的示例 序列。为所有 containers 中,请参阅 配置文件 部分