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 において特別に取り扱われるものです。 このプロセスのデフォルト動作は、あらゆるシグナルを無視します。 したがってこのプロセスが特別にコーディングされていない限り、SIGINTSIGTERM では停止しません。

TTY を有効にしたコンテナーにおいて、docker attach コマンドによってアタッチしている標準入力をリダイレクトすることは禁止されています。

docker attach コマンドを使って、クライアントがコンテナーの標準入出力に接続されている場合、Docker は最大 1 MB までのバッファを利用して、アプリケーションのスループットを最大化します。 このバッファがいっぱいになると、API 接続速度が、プロセス出力の書き込み速度に影響が出るようになります。 これは SSH のような他のアプリケーションにおいても発生することです。 このようなことがあるため、性能を重視するアプリケーションがフォアグラウンド出力を大量に行うものであって、低速なクライアント接続を必要とするものであれば、こういったアプリケーションの実行はお勧めできません。 その代わりに docker logs コマンドを使って、ログにアクセスするようにしてください。

デタッチシーケンスのオーバーライド

必要ならば、デタッチ時のキーシーケンスはオーバーライドすることができます。 これが必要になるのは、たとえばアプリケーションが利用するキーシーケンスが、Docker のデフォルトシーケンスと衝突してしまう場合です。 デタッチ時のキーシーケンスを独自に定義するには 2 つの方法があります。 コンテナーごとにオーバーライドする方法と、全体設定の中でプロパティ設定する方法です。

個々のコンテナーに対してシーケンスをオーバーライドするには、docker attach コマンドにおける --detach-keys="<シーケンス>" フラグを使います。 <シーケンス> の記述書式は、英文字 [a-Z] か、あるいは ctrl- に以下を組み合わせたもののいずれかです。

  • a-z (単一の英小文字)
  • @ (アットマーク)
  • [ (左ブラケット)
  • \\ (2 つのバックスラッシュ)
  • _ (アンダースコア)
  • ^ (キャレット)

キーシーケンスとして actrl-aXctrl-\\ はいずれも正しい例です。 コンテナー全体にわたって、デフォルトキーシーケンスを定義したい場合は 設定ファイル の節 を参照してください。

本コマンドの利用例については、以下に示す 利用例の節 を参照してください。

オプション

名前/省略形 デフォルト 説明
--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 の基本コマンド