1. docker attach
1.1. 描述
注意:
这是一个早期的连接/登录容器的命令,建议使用新的容器登录连接命令
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 (单个小写字母字符)
- @ (在标志处)
- [ (左括号)
- \ (两个反斜杠)
- _ (下划线)
- ^ (插入符号)
例如 a
,ctrl-a
,X
,或ctrl-\\
的退出组合都是合法的。
1.2. 帮助
$ 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)
1.3. 选项
名称,简写 | 默认值 | 描述 |
---|---|---|
--detach-keys | - | 指定 attach 退出时的快捷键 |
--no-stdin | - | 不要附上 STDIN |
--sig-proxy | true | 代理所有接收到的信号到进程 |
1.4. 示例
1.4.1. 登录一个运行中的容器
$ 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
1.4.2. 查看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