docker container attach
描述 | 将本地标准输入、输出和错误流附加到正在运行的容器 |
---|---|
用法 | docker container attach [OPTIONS] CONTAINER |
别名 | docker attach |
描述
使用docker attach
命令将您的终端的标准输入、输出和错误流(或三者中的任何组合)附加到正在运行的容器(使用容器的 ID 或名称)。这使您可以查看其输出或以交互方式控制它,就像命令直接在您的终端中运行一样。
注意
attach
命令显示容器ENTRYPOINT
和CMD
进程的输出。当进程实际上可能只是暂时没有写入任何输出时,这可能看起来像是 attach 命令挂起了。
您可以同时从 Docker 主机上的不同会话多次附加到同一个容器进程。
要停止容器,请使用CTRL-c
。此按键序列会向容器发送SIGKILL
信号。如果--sig-proxy
为真(默认值),则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 | 将所有接收到的信号代理到进程 |
示例
附加到正在运行的容器并从中分离
以下示例以分离模式启动运行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 符号)[
(左括号)\\
(两个反斜杠)_
(下划线)^
(插入符)
这些a
、ctrl-a
、X
或ctrl-\\
值都是有效的按键序列示例。要为所有容器配置不同的默认配置按键序列,请参阅配置文件部分。