Dockerコンテナーには、端末の入力ストリームと出力ストリームをコンテナーのプロセスにアタッチできるインタラクティブモードがあります。 Ctrl-Cを押すと、通常、そのプロセスが終了し、
コンテナが停止します。コンテナを停止せずにセッションからデタッチします。
Dockerは、コンテナーから適切にデタッチするためのキーボードの組み合わせをサポートしています。 Ctrl-Pを押してからCtrl-Qを押して、接続を解除します。
シェルにドロップバックされますが、以前にアタッチされたプロセスは存続し、コンテナは実行されたままになります。これは、 docker ps
を使用して確認できます。 実行中のコンテナのリストを取得します。
Ctrl-Cを押すか、 exit
を実行します コマンドは通常、特別に構成されていない限り、コンテナのフォアグラウンドプロセスを強制終了します。 Dockerコンテナーには、実行中のフォアグラウンドプロセスが必要です。コンテナがない場合は停止状態になります。
好みに合わせてデタッチシーケンスを変更したり、アプリケーションで使用されるキーボードショートカットとの競合を回避したりできます。 detachKeys
を追加します 〜/ .docker / config.json
のプロパティ 使用するキーを指定するファイル。
Dockerはa-z
をサポートします 文字と@
、 ^コード> 、および
_
、記号、および左角かっこ記号( [
)と2つのバックスラッシュ( \
)。これらはすべて、Ctrl-
と組み合わせて使用されます 鍵; Ctrl
を使用せずに、文字を個別に使用することもできます 。
キーシーケンスは、コンマ区切りのリストとして表されます:
{ "detachKeys": "Ctrl-d,d" }
この例では、 Ctrl-D
を押すとコンテナから切り離されます。 直後にd
が続きます キー。
Dockerは、グローバル構成を変更するだけでなく、 detachKeys
を受け入れます。 コンテナごとおよびアタッチメントごとにオーバーライドします。 -detach-keys
を追加します 特定のシーケンスを設定するためにコンテナプロセスにアタッチできるコマンドにフラグを立てます。
これをサポートするコマンドは次のとおりです。
ドッカー実行
ドッカースタート
-
docker exec
ドッカーアタッチ
コンテナにアタッチしてからCtrl-d
を使用する方法は次のとおりです 、その後にアンダースコアを付けて、切り離します:
docker attach my-container --detach-keys="Ctrl-d,_"
-detach-keys
flagは、 detachKeys
と同じキーシーケンス形式を使用します 構成オプション。フラグはdocker.json
をオーバーライドします 設定;これにより、DockerのデフォルトのCtrl-P/Ctrl-Qシーケンスが上書きされます。
キーボードシーケンスを発行した場合でも、デタッチを拒否するコンテナプロセスに遭遇する場合があります。これは、コンテナの入力ストリームが端末に接続されていない場合に発生する可能性があります( -i
フラグ)または疑似TTYが割り当てられていない( -t
国旗)。コンテナのプロセスがデタッチキーシーケンスを処理し、アタッチ時にオーバーライドしなかった場合にも、この問題が発生する可能性があります。
このような状況でも、ターミナルをコンテナから取り外すことは可能です。別のシェルウィンドウを一時的に開き、それを使用して docker.attach
を強制終了する必要があります 添付ファイルをアクティブに保つプロセス。
まず、添付プロセスのプロセスIDを見つけます:
ps -ef | grep attach
ps
からの出力を使用します docker.attach
を識別するため あなたが殺す必要があるプロセス。 CMD
のコマンド 列は、探している添付ファイルを識別する必要があります。関連するPID番号を書き留めて、 kill
を使用します このプロセスを強制終了するコマンド:
kill -9 <PID>
元のシェルがDockerコンテナから切り離され、通常の動作状態に戻るはずです。これで、2番目のシェルを閉じて、元のシェルを引き続き使用できます。
この手法は、ターミナルを実行し続けるコンテナー内のプロセスではなく、ターミナルをコンテナーに接続したDockerCLIプロセスを強制終了することで機能します。元の端末が再び使用可能になり、コンテナは稼働したままになります。
docker attach
を使用してコンテナに再接続できます 指図。これにより、端末の入力、出力、およびエラーストリームが指定されたコンテナに自動的に添付されます。
docker attach my-container
デフォルトでは、3つのストリームすべてが接続されています。 -no-stdin
を渡すことで、入力ストリームを省略できます。 国旗。コンテナの出力は端末にストリーミングされますが、入力を提供することはできません。
キーボードシーケンスをもう一度使用して切り離すか、 Ctrl-C
プロセスとコンテナを停止します。 Ctrl-C
を使用する場合 またはexit
、 docker attach
$?
を設定します コンテナの終了コードを検査できるように、シェルの変数を正しく設定してください。
Dockerコンテナーからデタッチする正しい方法は、かなりあいまいなキーボードシーケンスであり、シェルに戻ります。このシーケンスをカスタマイズして、覚えやすくし、コンテナのキーボード処理との競合を回避できます。
キーボードのデタッチシーケンスは、状況によっては効果がない場合があります。アタッチメントをサポートしているプロセスを特定して強制終了することで、コンテナから切り離すことができます。 ps
などの通常のUnixコマンド およびkill
このシナリオでは使用する必要があります。
最後に、コンテナを完全に切り離したい場合は、 -d
で開始します。 フラグ( docker run -d my-image:latest
)。これにより、コンテナがバックグラウンドに直接送信され、シェルに出力が出力されなくなります。切り離されたコンテナは、 docker ps
を使用して常に表示されます コマンドであり、 docker stop my-container
で停止できます 。