docker container attach

描述将本地标准输入、输出和错误流附加到运行中的容器
用法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 中被特殊对待:它会忽略任何具有默认操作的信号。因此,除非代码中进行了处理,否则进程不会因 SIGINTSIGTERM 而终止。

当附加到启用了 TTY 的容器(使用 -i-t 选项)时,您无法重定向 docker attach 命令的标准输入。

当客户端通过 docker attach 连接到容器的 stdio 时,Docker 使用大约 1MB 的内存缓冲区来最大化应用程序的吞吐量。一旦此缓冲区已满,API 连接的速度就会受到影响,因此这会影响输出进程的写入速度。这与其他应用程序(如 SSH)类似。因此,不建议在缓慢的客户端连接上以交互模式运行生成大量输出的性能关键型应用程序。相反,请使用 docker logs 命令访问日志。

选项

选项默认值描述
--detach-keys覆盖分离容器的键序列
--no-stdin不附加 STDIN
--sig-proxytrue将所有接收到的信号代理到进程

示例

附加和分离运行中的容器

以下示例启动一个以分离模式运行 top 的 Alpine 容器,然后附加到该容器;

$ 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-t 选项,信号会被转发到附加的进程,这意味着默认的 CTRL-p CTRL-q 分离组合键不起作用,但按下 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 (“读取转义序列”)时,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 的默认组合键与您用于其他应用程序的组合键冲突,这将很有用。有两种方法可以定义自己的分离组合键:作为每个容器的覆盖,或作为整个配置的配置属性。

要覆盖单个容器的序列,请在 docker attach 命令中使用 --detach-keys="<sequence>" 标志。 <sequence> 的格式是字母 [a-Z],或 ctrl- 与以下任何一项的组合

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

这些 actrl-aXctrl-\\ 值都是有效组合键的示例。要为所有容器配置不同的默认组合键,请参阅配置文件部分

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.