docker container attach
| 内容説明 | ローカルの標準入出力やエラー出力を実行中のコンテナーにアタッチします。 |
|---|---|
| 利用方法 | docker container attach [OPTIONS] CONTAINER |
| エイリアス | docker attach |
内容説明
docker attach は端末の標準入力、標準出力、標準エラー出力のいずれか (あるいはそれら 3 つの組み合わせ) を実行コンテナーにアタッチします。
アタッチはコンテナー ID またはコンテナー名を用いて指定されます。
これを行うと、コマンド実行を端末内で行ったとしても、その出力確認や対話的制御を実現できます。
メモ
attachコマンドはコンテナーのENTRYPOINTまたはCMDプロセスの出力を表示します。 この際にそれらのプロセスは、実際には本当に何も出力していないことがあるため、このアタッチコマンドがハングしているかのように見える場合があります。
この操作は同一のコンテナープロセスに対して、Docker ホスト上の別セッションからであれば、同時に何個でもアタッチすることができます。
コンテナーを停止するには CTRL-c を入力します。
このキーシーケンスはコンテナーに対して SIGKILL を送信します。
--sig-proxy が true (デフォルト) の場合、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 ("read escape sequence") を入力すると、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
コンテナーコマンドの終了コード取得
2 つめのこの例では 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 のデフォルトキーシーケンスが、アプリケーションにおいて利用するキーシーケンスと衝突する場合に活用することができます。
デタッチキーシーケンスの定義方法は 2 つあります。
設定を行うにあたって個々のコンテナーに対する上書きとするのか、設定プロパティとして上書きするのかです。
個別のコンテナーに対してのシーケンスを上書きするには、docker attach コマンドの --detach-keys="<sequence>" フラグを用います。
<sequence> の書式は [a-Z] の 1 文字とするか、あるいは以下のいずれかと ctrl- を組み合わせるかです。
a-z(単一の英小文字)@(アットマーク)[(左ブラケット)\\(2 つのバックスラッシュ)_(アンダースコア)^(キャレット)
a、ctrl-a、X、ctrl-\\ といった記述は、いずれもキーシーケンスとして正しいものです。
コンテナーすべてについてデフォルトキーシーケンスを設定する別の方法としては、
設定ファイル の節 を参照してください。