Dockerのプロセスにどのようにアタッチし、デタッチしますか?


459

dockerプロセスにアタッチできますが、Ctrl+ cから切り離すことができません。exit基本的にプロセスを停止します。

プロセスを実行し、時々アタッチして変更を加え、その後デタッチするための推奨ワークフローは何ですか?


4
nsenterを使用するときは、Ctrl-Dを押します。
user2105103 2014年

閉じないxtermkonsoleなど、仕事を?それは私のために働きます(私は離れてしまいます)。
Vytenis Bivainis 2017年

回答:


668

シェルを終了せずにttyを切り離すには、エスケープシーケンスCtrl+のP後にCtrl+を使用しQます。詳細はこちら

このソースからの追加情報:

  • docker run -t -i→ ^P^Qdocker attachでデタッチおよび再アタッチできます
  • docker run -i→で切り離すことはできません^P^Q。stdinを混乱させる
  • docker run→で切り離すことはできません^P^Q。クライアントをSIGKILLできます。docker attachで再接続できます

46
これが実際にドキュメントで説明されているように機能した場合、これは素晴らしい答えになります。
allingeek 2014

20
-itを指定して実行している場合でも、コンテナーをクリーンアップフラグ(--rm)で開始すると、切断シーケンスが失敗することがわかりました。これは一部の人にとっては明白かもしれませんが、私が認めたいよりも頻繁に私を噛みます。
allingeek 2014年

7
別のオプションは、ターミナルウィンドウまたはcmd-wを閉じるだけです:)
buildmaestro

3
あなたは、例えばで設定切り離しキーを設定することができ"detachKeys": "ctrl-a,a"、あなたの.docker / config.jsonファイルまたは --detach-keys "ctrl-a,a"その他添付して、コマンドラインで
マシュー・ハニガン

4
Ctrl + Z分離しません。プロセスの背景のみです。デタッチとは異なり、パフォーマンスが低下します。
Zenexer 2018年

178

また、チェックアウトオプションを--sig-proxy

docker attach --sig-proxy=false 304f5db405ec

次に、CTRL+ cを使用してデタッチします


4
attachの代わりにrunでこれを試すために、私は試しました:動作して docker run -ti --sig-proxy=false busybox top いないようですが、プロセスはctrl-cで強制終了されますが docker run -t -sig-proxy=false busybox top 、動作するようで、ctrl-cで終了できるようになっています
Henning

Ctrl-cコンテナも停止します。
Evan Hu

これは、Docker 19.03.5を実行しているDebian 9サーバーで私のために機能する、ここにリストされたものからの唯一のソリューションです。問題は、なぜこれが接続コマンドのデフォルト設定ではないのですか?最も一般的な使用例のようです。
fviktor

Ctrl-p、Ctrl-qシーケンスが機能しません(dockerコンテナーattach xyzとして開始)。ありがとう@czerasz
PravyNandas

92

ファイルに何らかの変更を加えたり、プロセスを検査したりするだけの場合は、おそらく別のソリューションが必要です。

次のコマンドを実行して、既存のコンテナから新しいプロセスを実行できます。

sudo docker exec -ti [CONTAINER-ID] bash

bashシェルで新しいプロセスを開始し、直接Ctrl+でエスケープすることができCます。元のプロセスには影響しません。


6
これは機能し、元のプロセスに影響を与えずに完了したら「exit」と入力できます。
Eko3alpha 2016年

これは、実行中のコンテナーにアタッチするのに最適な方法です。しかし、(たとえば)コンテナで実行中のプロセスがあり、そのプロセスを再起動したい場合はどうなりますか?ああ、私は古いプロセスを強制終了して新しいプロセスを再起動し、Cp、Cqを使用することができます。これはインタラクティブなttyなので機能します。--sig-proxy = falseメソッドも好きですが、これはより用途が広く、現在のプロセスの中断を強制しません。
taranaki 2017

「アタッチ」はDockerで特定の意味を持ってexecいますが、そうではありません。
frnhr

48

これは状況に応じて異なると思います。次のコンテナを例にとります。

# docker run -it -d ubuntu
91262536f7c9a3060641448120bda7af5ca812b0beb8f3c9fe72811a61db07fc
# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
91262536f7c9        ubuntu              "/bin/bash"         5 seconds ago       Up 4 seconds                            serene_goldstine

(1) " docker attach"を使用してコンテナをアタッチします。

docker attach新しいttyを割り当てませんが、元の実行中のttyを再利用するため、exitコマンドを実行すると、実行中のコンテナーが終了します。

# docker attach 91262536f7c9
exit
exit
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
91262536f7c9        ubuntu              "/bin/bash"         39 minutes ago      Exited (0) 3 seconds ago                       serene_goldstine

したがって、実行中のコンテナを本当に終了させたいのでない限り、Ctrl+ p+ Ctrl+ を使用する必要がありますq

(2)「docker exec」を使用

docker exec新しいtty 割り当てるためexitCtrl+ p+ Ctrl+の代わりに使用する必要があると思いますq

以下は、コンテナを終了するためにCtrl+ p+ Ctrl+ qを実行しています。

# docker exec -it 91262536f7c9 bash
root@91262536f7c9:/# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  18160  1908 ?        Ss+  04:03   0:00 /bin/bash
root        15  0.0  0.0  18164  1892 ?        Ss   04:03   0:00 bash
root        28  0.0  0.0  15564  1148 ?        R+   04:03   0:00 ps -aux
root@91262536f7c9:/# echo $$
15

次に、コンテナに再度ログインするとbash、前のdocker execコマンドのプロセスがまだ有効であることがわかります(PIDは15)。

# docker exec -it 91262536f7c9 bash
root@91262536f7c9:/# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  18160  1908 ?        Ss+  04:03   0:00 /bin/bash
root        15  0.0  0.0  18164  1892 ?        Ss+  04:03   0:00 bash
root        29  0.0  0.0  18164  1888 ?        Ss   04:04   0:00 bash
root        42  0.0  0.0  15564  1148 ?        R+   04:04   0:00 ps -aux
root@91262536f7c9:/# echo $$
29

39

実行中のコンテナから切り離すには、を使用します^P^Q(をCtrl押しながら、を押しP、を押してQ、を離しますCtrl)。

落とし穴があります。これは、コンテナがとの両方 -tで開始された場合にのみ機能し-iます。

これらのオプションのいずれか(または両方)なしで開始された実行中のコンテナーがあり、を使用して接続するdocker attach場合は、分離する別の方法を見つける必要があります。選択したオプションと実行中のプログラムによっては、機能する場合と、^Cコンテナ全体が強制終了する場合があります。実験する必要があります。

もう1つの問題:使用しているプログラムに応じて、ターミナル、シェル、SSHクライアント、またはマルチプレクサーが、^Pまたは^Q(通常は後者)のいずれかを傍受している可能性があります。これが問題であるかどうかをテストするには、--detach-keys z引数を指定して実行またはアタッチしてみてください。zこれで、モディファイアを使用せずに、を押してデタッチできるようになります。これが機能する場合、別のプログラムが干渉しています。これを回避する最も簡単な方法は、引数を使用して独自の切り離しシーケンス設定する--detach-keysことです。(たとえば、で終了するには^K、を使用します--detach-keys 'ctrl-k'。)または、端末または他の干渉プログラムでキーのインターセプトを無効にすることを試みることができます。たとえば、stty start ''またはstty start undef端末が傍受するのを妨げる可能性があります^Q 一部のPOSIXシステムでは、これが役立つとは思っていません。


2
非常に正確な説明、魅力のように機能しました
Meir Gabay

27

他に何も機能しない場合は、新しいターミナルを開いてください:

$ ps aux | grep attach
username  <pid_here>    ..............  0:00 docker attach <CONTAINER_HASH_HERE>
username  <another_pid> ..............  0:00 grep --color=auto attach
$ kill -9 <pid_here>

なんという罠だ!ありがとう、これだけがうまくいきました。-9必要ありませんでした。
ヒースラフター

これにより、コンテナも強制終了されます。設定されたフラグに依存する可能性があります。
AdamAL

1
2つのPIDが表示されている場合は、最初のPIDが親であることに注意してください。親ではなく、2番目のpid使用してkill する必要がありますdocker attach
joeytwiddle

11

コンテナーから切り離すには、そのままCtrl押したままP+ を押しQます。

実行中のコンテナに接続するには、次を使用します。

$ docker container attach "container_name"

9

私は、同じ問題を持っていたctrl- PQの仕事ではないだろう、でもctrl- C最終的に私は別のターミナルセッションを開いて、私は「ドッキングウィンドウ停止しました... ContainerIDの」および「ドッキングウィンドウの開始ContainerIDのを」と、それは仕事を得ました。変だ。


--rmフラグでコンテナを開始した場合、これは機能しません。Ctrl+PそしてCtrl+Qあなたがコンテナを開始した場合に動作-itフラグ。
Aswath K 2018

4

同じシェルでは、保留ctrlキーを押しながらキーをp、次にq


3
これは、コンテナーを-itフラグで開始した場合にのみ機能します。
Aswath K 2018



0

dockerプロセスを停止してポートを解放するには、最初にctrl- cを使用して出口をコンテナーから残し、次にdocker psを使用して実行中のコンテナーのリストを検索します。次に、Dockerコンテナーの停止を使用してそのプロセスを停止し、そのポートを解放できます。名前列に名前を与えるdocker psコマンドから見つけることができるコンテナー名。これでクエリが解決することを願っています...


0

Dockerプロセスだけがバックグラウンドで実行される必要がある場合は、使用できます

Ctrl + Z

これは実際の切り離しではなく、パフォーマンスの低下を伴うことに注意してください。(あなたはそれをフォアグラウンドに戻すことができますbgコマンドで)。

もう必要がない場合は、ターミナルを閉じるだけです。


0

同じ問題に遭遇した人のために(デタッチキーを設定した場合でも、コンテナーを強制終了せずにデタッチすることはできません)......

コンテナを docker-compose up -d

使用する代わりに docker attach {container name}してテーリングログを表示する ....

試してくださいdocker-compose logs -f {service name} ctrl-cあなたのコンテナを殺すことなく、ログの末尾を殺します

{service name} docker-compose.ymlファイルの横にリストされているサービスです。 docker(例:コンテナー名= elk_logstash_1->サービス名= logstash

HTH


0

更新

私は通常、コンテナのトラブルシューティングのために、docker attachを使用して、STDOUTが表示していたものを確認しました。見つけたdocker logs --follow 621a4334f97b。コンテナの操作に影響を与えずに、STDOUTを表示しながら、Ctrl + Cでそれをオフにすることができます。まさに私がずっと欲しかったもの。

...当然、独自のコンテナIDで置き換える必要があります。

元の回答

コンテナを実行したままにしたかったのですが、コンテナをで起動せずにアタッチしていました-it。私の解決策は、代わりにSSH接続を犠牲にすることでした(コンテナーを実行しているマシンにSSH接続されたため)。そのsshセッションを終了すると、コンテナーはそのまま残りましたが、コンテナーから切り離されました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.