docker attach
読む時間の目安: 3 分
説明
ローカルの標準入出力やエラー出力を実行中コンテナーにアタッチします。
利用方法
$ docker attach [オプション] CONTAINER
追加説明
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 を有効にしたコンテナーにおいて、docker attach
コマンドによってアタッチしている標準入力をリダイレクトすることは禁止されています。
docker attach
コマンドを使って、クライアントがコンテナーの標準入出力に接続されている場合、Docker は最大 1 MB までのバッファを利用して、アプリケーションのスループットを最大化します。
このバッファがいっぱいになると、API 接続速度が、プロセス出力の書き込み速度に影響が出るようになります。
これは SSH のような他のアプリケーションにおいても発生することです。
このようなことがあるため、性能を重視するアプリケーションがフォアグラウンド出力を大量に行うものであって、低速なクライアント接続を必要とするものであれば、こういったアプリケーションの実行はお勧めできません。
その代わりに docker logs
コマンドを使って、ログにアクセスするようにしてください。
デタッチシーケンスのオーバーライド
必要ならば、デタッチ時のキーシーケンスはオーバーライドすることができます。 これが必要になるのは、たとえばアプリケーションが利用するキーシーケンスが、Docker のデフォルトシーケンスと衝突してしまう場合です。 デタッチ時のキーシーケンスを独自に定義するには 2 つの方法があります。 コンテナーごとにオーバーライドする方法と、全体設定の中でプロパティ設定する方法です。
個々のコンテナーに対してシーケンスをオーバーライドするには、docker attach
コマンドにおける --detach-keys="<シーケンス>"
フラグを使います。
<シーケンス>
の記述書式は、英文字 [a-Z] か、あるいは ctrl-
に以下を組み合わせたもののいずれかです。
a-z
(単一の英小文字)@
(アットマーク)[
(左ブラケット)\\
(2 つのバックスラッシュ)_
(アンダースコア)^
(キャレット)
キーシーケンスとして a
、ctrl-a
、X
、ctrl-\\
はいずれも正しい例です。
コンテナー全体にわたって、デフォルトキーシーケンスを定義したい場合は 設定ファイル の節 を参照してください。
本コマンドの利用例については、以下に示す 利用例の節 を参照してください。
オプション
名前/省略形 | デフォルト | 説明 |
--detach-keys |
コンテナーデタッチ時のキーシーケンスをオーバーライドします。 | |
--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
コンテナーコマンドの終了コードの取得
以下の 2 つめの例では、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
上位コマンド
コマンド | 説明 |
---|---|
docker | Docker CLI の基本コマンド |