docker attach

命令

docker attach

描述

用于将标准输入、标准输出、标准错误流连接到正在运行的容器,即登录正在运行的容器。

这是一个早期的登录容器的命令,建议使用新的容器登录连接命令docker exec替代。

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

注意: 该 attach 命令将显示 ENTRYPOINT/CMD 进程的输出。终端屏幕会输出覆盖,和在 shell 命令行屏幕输出 Critical 硬件告警异常类似,此时依旧可以输入命令控制容器。

您可以从 Docker 主机上的不同会话同时多次附加到相同的包含进程。当有多个终端同时连接时,输入输出会在多个终端进行同步,即屏幕共享。

要停止容器,请使用CTRL-c。该快捷键发送 SIGKILL 到容器。如果 --sig-proxy 设置为 true(默认值),则将CTRL-c发送 SIGINT 到容器。您可以使用CTRL-p CTRL-q 快捷键从容器中分离并使其运行 。

注意: Linux 会特别处理在容器内 PID 1 运行的进程:它会忽略具有默认操作的任何信号。因此,该过程将不会终止,SIGINT 或者 SIGTERM 除非被编码为终止该过程。

使用 docker attach 将客户端连接到容器的 STDIO 时,Docker 使用约 1MB 的内存缓冲区来最大化应用程序的吞吐量。如果此缓冲区已满,则 API 连接的速度将开始对进程输出的写入速度产生影响。这类似于 SSH 之类的其他应用程序。因此,不建议 attach 到容器里面查看类似 log 的输出,建议使用 docker logs 的方式查看。

容器退出时使用的快捷键可能和其他应用配置的产生冲突,用户可以定制自己的 attach 后退出的快捷键。可以在容器运行前覆盖原有的退出快捷键,或者添加到配置文件中。

在执行 docker attach 时配置--detach-keys="<sequence>"选项可以设置退出时的快捷键。这里的<sequence>是可以是[a-Z]里面的内容。或者使用Ctrl +以下组合

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

例如 actrl-aX,或ctrl-\\ 的退出组合都是合法的。

帮助

# docker attach --help
Usage: docker attach [OPTIONS] CONTAINER
Attach local standard input, output, and error streams to a running container
Options:
      --detach-keys string Override the key sequence for detaching a container
      --no-stdin Do not attach STDIN
      --sig-proxy Proxy all received signals to the process (default true)

选项

名称,简写 默认值 描述
–detach-keys   指定 attach 退出时的快捷键
–no-stdin   不要附上 STDIN
–sig-proxy true 代理所有接收到的信号到进程

示例

登录一个运行中的容器

$ docker run -d --name topdemo ubuntu /usr/bin/top -b

$ docker attach topdemo

top - 02:05:52 up  3:05,  0 users,  load average: 0.01, 0.02, 0.05
Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.1%us,  0.2%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    373572k total,   355560k used,    18012k free,    27872k buffers
Swap:   786428k total,        0k used,   786428k free,   221740k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1 root      20   0 17200 1116  912 R    0  0.3   0:00.03 top

 top - 02:05:55 up  3:05,  0 users,  load average: 0.01, 0.02, 0.05
 Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
 Cpu(s):  0.0%us,  0.2%sy,  0.0%ni, 99.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
 Mem:    373572k total,   355244k used,    18328k free,    27872k buffers
 Swap:   786428k total,        0k used,   786428k free,   221776k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
       1 root      20   0 17208 1144  932 R    0  0.3   0:00.03 top


 top - 02:05:58 up  3:06,  0 users,  load average: 0.01, 0.02, 0.05
 Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
 Cpu(s):  0.2%us,  0.3%sy,  0.0%ni, 99.5%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
 Mem:    373572k total,   355780k used,    17792k free,    27880k buffers
 Swap:   786428k total,        0k used,   786428k free,   221776k cached

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
      1 root      20   0 17208 1144  932 R    0  0.3   0:00.03 top
^C$

$ echo $?
0


$ docker ps -a | grep topdemo

7998ac8581f9        ubuntu:14.04        "/usr/bin/top -b"   38 seconds ago      Exited (0) 21 seconds ago                          topdemo

查看bash的退出码

可以看到该 bash 过程返回的退出代码也由 docker attach 命令返回给其调用者

    $ docker run --name test -d -it debian
    275c44472aebd77c926d4527885bb09f2f6db21d878c75f0a1c212c03d3bcfab

    $ docker attach test
    root@f38c87f2a42d:/# exit 13
    exit

    $ echo $?
    13

    $ docker ps -a | grep test
    275c44472aeb        debian:7            "/bin/bash"         26 seconds ago      Exited (13) 17 seconds ago                         test

参考

  • https://docs.docker.com/engine/reference/commandline/attach/