Docker 容器附加
描述 | 将本地标准输入、输出和错误流附加到正在运行的容器 |
---|---|
用法 | 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:它使用 default作忽略任何信号。所以,这个过程 不终止于
SIGINT
或SIGTERM
除非它被编码为这样做。
您不能重定向docker attach
命令,而
附加到启用了 TTY 的容器(使用-i
和-t
选项)。
当客户端连接到容器的stdio
用docker attach
,
Docker 使用 ~1MB 内存缓冲区来最大化应用程序的吞吐量。
一旦此缓冲区已满,API 连接的速度就会受到影响,因此
这会影响 output 进程的写入速度。这与其他
像 SSH 这样的应用程序。因此,不建议运行
在
前台通过慢速客户端连接。相反,请使用docker logs
命令来访问日志。
选项
选择 | 违约 | 描述 |
---|---|---|
--detach-keys | 覆盖用于分离容器的键序列 | |
--no-stdin | 不要附加 STDIN | |
--sig-proxy | true | 将所有接收到的信号代理到进程 |
例子
附加到正在运行的容器和从中运行的容器分离
以下示例启动一个正在运行的 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
和-t
options 时,信号是
forwarded 到附加的进程,这意味着默认的CTRL-p CTRL-q
Detach 键序列不会产生任何效果,但按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
,X
或ctrl-\\
values 都是 valid key 的示例
序列。为所有
containers 中,请参阅 配置文件 部分。