docker container attach
| 描述 | 将本地标准输入、输出和错误流连接到正在运行的容器 |
|---|---|
| 用法 | docker container attach [OPTIONS] CONTAINER |
| 别名 | docker attach |
描述
使用 docker attach 将终端的标准输入、输出和错误(或三者的任意组合)通过容器的 ID 或名称连接到正在运行的容器。这使您可以查看其输出或以交互方式控制它,就像命令直接在您的终端中运行一样。
注意
attach命令显示容器的ENTRYPOINT和CMD进程的输出。这可能看起来像是 attach 命令挂起了,但实际上 该进程可能只是在当时没有写入任何输出。
您可以同时从 Docker 主机上的不同会话多次连接到同一个容器进程。
要停止容器,请使用 CTRL-c。此组合键向容器发送 SIGKILL。如果 --sig-proxy 为 true(默认值),CTRL-c 会向容器发送 SIGINT。如果容器是使用 -i 和 -t 运行的,您可以使用 CTRL-p CTRL-q 组合键与容器分离并使其保持运行。
注意
在容器内作为 PID 1 运行的进程会被 Linux 特殊对待:它会忽略任何具有默认操作的信号。因此,除非经过编码处理,否则该进程不会在收到
SIGINT或SIGTERM时终止。
无法在连接到启用 TTY 的容器(使用 -i 和 -t 选项)时重定向 docker attach 命令的标准输入。
当客户端使用 docker attach 连接到容器的 stdio 时,
Docker 使用约 1MB 的内存缓冲区来最大化应用程序的吞吐量。
一旦此缓冲区已满,API 连接的速度就会受到影响,从而
影响输出进程的写入速度。这与 SSH 等其他
应用程序类似。因此,不建议在
慢速客户端连接上通过前台运行生成大量输出的
性能关键型应用程序。相反,请使用 docker logs
命令来获取日志。
选项
| 选项 | 默认 | 描述 |
|---|---|---|
--detach-keys | 覆盖用于分离容器的按键序列 | |
--no-stdin | 不要附加 STDIN | |
--sig-proxy | true | 将所有接收到的信号代理到该进程 |
示例
连接到正在运行的容器或从中分离
下面的示例启动一个 Alpine 容器,在分离模式下运行 top,
然后连接到该容器;
$ 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 的默认序列与您用于其他应用程序的按键序列冲突,这会很有用。
有两种方法可以定义您自己的分离按键序列:作为每个容器的覆盖设置,或作为整个配置中的配置属性。
要覆盖单个容器的顺序,请将 --detach-keys="<sequence>" 标志与 docker attach 命令一起使用。<sequence> 的格式可以是字母 [a-Z],或者 ctrl- 与以下任意一项结合使用:
a-z(单个小写字母字符 )@(at 符号)[(左括号)\\(两个反斜杠)_(下划线)^(插入符)
这些 a、ctrl-a、X 或 ctrl-\\ 值都是有效密钥序列的示例。要为所有容器配置不同的默认密钥序列,请参阅
配置文件 部分。