Dockerコンテナは、「docker run -d」の後に自動的に停止します


333

これまで読んだチュートリアルによると、「docker run -d」を使用すると、イメージからコンテナが開始され、コンテナはバックグラウンドで実行されます。これは、コンテナIDがすでにあることがわかります。

root@docker:/home/root# docker run -d centos
605e3928cdddb844526bab691af51d0c9262e0a1fc3d41de3f59be1a58e1bd1d

しかし、「docker ps」を実行した場合、何も返されませんでした。

docker ps -a」を試したところ、コンテナがすでに終了していることがわかります。

root@docker:/home/root# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS                         PORTS               NAMES
605e3928cddd        centos:latest         "/bin/bash"         31 minutes ago      Exited (0) 31 minutes ago                          kickass_swartz

私が間違ったことは何ですか?この問題のトラブルシューティング方法を教えてください。


1
「docker run hello-world」<==は完全に機能しますが、「docker run -d hello-world」を実行しても、実行中のコンテナーを取得できません。
Jジョン

5
同様の問題がありましたdocker run -it -d <image> /bin/bashが、これを使用してbashシェルを対話的に起動し、シェルプロセスがアクティブであるためコンテナーを閉じません。
Rtsne42 2017年

回答:


495

CentOSのdockerfileデフォルトのコマンドがありますbash

つまり、バックグラウンド(-d)で実行すると、シェルはすぐに終了します。

2017年の更新

さらに最近では、両方のコンテナを実行するためのドッキングウィンドウのAUTHORIZEのバージョン切り離さモード フォアグラウンドモード-t-iまたは-it

その場合、追加のコマンドは必要なく、これで十分です。

docker run -t -d centos

bashはバックグラウンドで待機します。
それは最初に報告されたkalyani-chaudhariさんの答えとで詳述ジャージビーンさんの答え

vonc@voncvb:~$ d ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
4a50fd9e9189        centos              "/bin/bash"         8 seconds ago       Up 2 seconds                            wonderful_wright

高山ではMarinos An がコメントで報告していることに注意してください。

docker run -t -d alpine/gitプロセスを維持しません。
しなければならなかった:docker run --entrypoint "/bin/sh" -it alpine/git


元の回答(2015)

この記事で述べたように:

で実行する代わりにdocker run -i -t image your-command、を使用-dすることをお勧めします。コンテナを1つのコマンドで実行でき、Ctrl+ P+ を押してコンテナのターミナルを切り離す必要がないためQです。

ただし、-dオプションに問題があります。コマンドがフォアグラウンドで実行されていない限り、コンテナーはすぐに停止します
Dockerでは、コマンドをフォアグラウンドで実行し続ける必要があります。それ以外の場合は、アプリケーションが停止してコンテナがシャットダウンされたと見なされます。

問題は、一部のアプリケーションがフォアグラウンドで実行されないことです。どうすれば簡単にできますか?

この状況ではtail -f /dev/null、コマンドに追加できます。
これにより、メインコマンドがバックグラウンドで実行されても、テールがフォアグラウンドで実行され続けるため、コンテナーは停止しません。

だからこれはうまくいくでしょう:

docker run -d centos tail -f /dev/null

A docker psは、centosコンテナーがまだ実行中であることを示します。

そこから、それにアタッチしたり、そこからデタッチしたりできdocker execます(または一部のコマンド)。


申し訳ありませんが、もう1つ質問があります。起動時にスクリプトを実行する必要があります。/etc/rc.d/rc.localが機能しなくなったようです(私の考え方では、DockerをOSのように扱っています)。場合?
Jジョン

5
@GuruprasadGV予想通りです。docker attachを使用する代わりに、を使用しますdocker exec -it <yourContainer> bash
VonC 2016年

3
これは、エントリポイントファイルの最後にtailコマンドを追加した場合にも機能します。
ヤラ2017年

2
最後の(長時間実行する)コマンドとしてsshdを使用しました。その後、VMの場合と同じようにコンテナーにsshを実行できます(.ssh / authorized_keysなどを設定したら)... ansibleを使用してコンテナーを構成することもできます。
アンドリューパテ2017年

1
私はこれを実行してコマンドと上記の古い修正を実行しました:docker run image_name / bin / bash -c "my / command && tail -f / dev / null"
Geordie

58

この回答によると、-tフラグを追加すると、バックグラウンドで実行しているときにコンテナーが終了しなくなります。次に、を使用docker exec -i -t <image> /bin/bashしてシェルプロンプトに入ることができます。

docker run -t -d <image> <command>

ヘルプには「疑似TTYを割り当てる」と記載されています、-tオプションはあまりドキュメントに記載されていないようです。


10
いいね。追加よりもハックが少ないようですtail -f /dev/null
Scarysize

ありがとう!ほんのわずかなチャンスでこれは誰かを助けますが、これはEmacs Eshellではうまく動作しません。
Peter Becich 2017

2
docker run -t -d --name mysql -p 3306:3306 mysql-動作しません(ubuntu 14.04.5):STATUS =終了(1)4秒前
Putnik

必要でない限り、ここでは<command>は必要ないことがわかりました。奇妙なことに、これは-tを-i(インタラクティブ)に置き換えることもできます。このドキュメントでは、-tと-iを組み合わせて使用​​するとシェルのように動作することを述べています。
ジャージー豆

43

バックグラウンド

Dockerコンテナーは、それを存続させるプロセス(「コマンド」または「エントリーポイント」)を実行します。コマンドが実行されている限り、コンテナは実行を続けます。

あなたの場合、コマンド(/bin/bashデフォルトではon centos:latest)はすぐに終了します(bashがターミナルに接続されておらず、実行するものがない場合と同様です)。

通常、デーモンモードでコンテナを実行すると(を使用-d)、コンテナは何らかのデーモンプロセス(などhttpd)を実行します。この場合、httpdデーモンが実行されている限り、コンテナーは存続します。

実行しようとしているように見えるのは、コンテナー内でデーモンプロセスが実行されていない状態でコンテナーを存続させることです。これは少し奇妙ですが(おそらくと対話するまで、コンテナーは何も役に立たないためdocker exec)、このようなことを行うと意味がある場合があります。

(あなたはコンテナ内のbashプロンプトに到達するつもりでしたか?それは簡単です!docker run -it centos:latest

解決

コンテナーをデーモンモードで無期限に存続させる簡単な方法はsleep infinity、コンテナーのコマンドとして実行することです。これは、デーモンモードでTTYを割り当てるなどの奇妙なことを行うことには依存しません。それはsleepあなたの主なコマンドとして使用するような奇妙なことをすることに依存していますが。

$ docker run -d centos:latest sleep infinity
$ docker ps
CONTAINER ID  IMAGE         COMMAND          CREATED       STATUS       PORTS NAMES
d651c7a9e0ad  centos:latest "sleep infinity" 2 seconds ago Up 2 seconds       nervous_visvesvaraya

代替ソリューション

cjsimonが示すように、この-tオプションは「疑似tty」を割り当てます。これは、bashを無期限に実行し続けるように仕向けます。なぜなら、それがインタラクティブTTYに接続されていると考えているからです(渡さないと、特定のTTYとやり取りする方法はありません-i)。とにかく、これもトリックを行う必要があります:

$ docker run -t -d centos:latest

-t他の奇妙な相互作用が発生するかどうかは100%わかりません。もしそうなら、下にコメントを残してください。


BusyBoxのスリープは受け入れないため、これは高山では機能しませんinfinity
John Kugelman

これはamazon-linuxイメージのトラブルシューティングに役立ちました。ありがとう
影響力のある

18

こんにちはこの問題は、コンテナーに実行中のアプリケーションがない場合、Dockerコンテナーが終了するためです。

-d 

オプションは、単にデーモンモードでコンテナを実行することです。

したがって、コンテナを継続的に実行するコツは、アプリケーションを実行し続けるDockerのシェルファイルを指すことです。start.shファイルで試すことができます。

Eg: docker run -d centos sh /yourlocation/start.sh

このstart.shは、終了しないアプリケーションを指す必要があります。

アプリケーションを実行したくない場合はmonit、Dockerコンテナーを実行したままにしておくことができます。これらの2つのケースがコンテナの実行を維持するのに役立つかどうかをお知らせください。

ではごきげんよう


12

次のいずれかを使用して、必要なことを実行できます。

docker run -t -d <image-name>

または

docker run -i -d <image-name>

または

docker run -it -d <image-name>

他の回答(つまり、tail -f / dev / null)で提案されているコマンドパラメーターは完全にオプションであり、コンテナーをバックグラウンドで実行し続けるために必要ではありません。

また、Dockerのドキュメントでは、-iオプションと-tオプションを組み合わせるとシェルのように動作することが示唆されています。

見る:

https://docs.docker.com/engine/reference/run/#foreground


9

ENTRYPOINT私のdockerファイルからこのコードスニペットを実行しています:

while true
do
    echo "Press [CTRL+C] to stop.."
    sleep 1
done

ビルドされたDockerイメージを次のように実行します。

docker run -td <image name>

コンテナーシェルにログインします。

docker exec -it <container id> /bin/bash

これは、このために無限ループを作成したソリューションですか?:D
Muhammad SaLman

8

次のようにコマンドを実行します。

docker run -t -d <image-name>

ポートを指定する場合は、次のコマンドを実行します。

docker run -t -d -p <port-no> <image-name>

次のコマンドを使用して、実行中のコンテナを確認します。

docker ps

最も人気のある答えはコマンド(つまり、tail -f / dev / null)が必要であることを示唆しているので、私は実際にこの答えが一番好きです。コマンドは完全にオプションです。ここで重要なのは、-tを使用することです。-iが-tの代わりに機能することもわかりました。または、-itを組み合わせて使用​​することもできます(ドキュメントではシェルとして実行されることを示しています)。
ジャージー豆

-t -dvs を使用する利点はあります-i -dか?どちらもコンテナを実行し続けます。
wisbucky 2017

5

Dockerでは、コマンドをフォアグラウンドで実行し続ける必要があります。それ以外の場合は、アプリケーションが停止してコンテナがシャットダウンされたと見なされます。

したがって、Dockerエントリスクリプトが次のようなバックグラウンドプロセスである場合:

/usr/local/bin/confd -interval=30 -backend etcd -node $CONFIG_CENTER &

「&」は、後でトリガーされる他のフォアグラウンドプロセスがない場合にコンテナーを停止して終了します。したがって、解決策は単に「&」を削除するかその後に別のフォアグラウンドCMDを実行させることです

tail -f server.log

touchログファイルが見つからない場合に備えて、最初にそのファイルを使用することをお勧めします。
Samuel Elh

通常、私がテールするログファイルは、現在のサーバーログまたはリダイレクト出力であり、プロセスの開始後に既に存在しているはずです。
Peiming Hu

4

Dockerコンテナは、内部のタスクが完了すると終了しますdocker run -di image。そのため、ジョブがない場合や既に完了している場合でも、Dockerコンテナを存続させたい場合は、実行できます。実行docker container lsすると、実行されていることがわかります。


3

多分それは私だけかもしれませんが、CentOS 7.3.1611とDocker 1.12.6では、@ VonCと@Christopher Simonによって投稿された回答を組み合わせて使用​​する必要がありました。これまでに私がしたことは、CMDが正常に実行された後にコンテナーが終了するのを妨げるものではありませんでした。oracle-xe-11Gr2とsshdを起動しています。

Dockerfile

...
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' && systemctl enable sshd
...
CMD /etc/init.d/oracle-xe start && /sbin/sshd && tail -f /dev/null

次に-d -tと-iを追加して実行します

docker run --shm-size=2g --name oracle-db -d -t -i -p 5022:22 -p 5080:8080 -p 1521:1521 centos-oracle:7.3.1611 

何時間も壁に頭をぶつけた後

ssh -v root@127.0.0.1 -p 5022
...
root@127.0.0.1's password: 
debug1: Authentication succeeded (password).

何らかの理由で、tail -fが削除された場合、または-t -d -iオプションのいずれかが省略された場合、上記はCMDの実行後に終了します。



1

私は同じ問題を抱えていましたが、bashで別のターミナルを開くだけでうまくいきました:

コンテナを作成:

docker run -d mcr.microsoft.com/mssql/server:2019-CTP3.0-ubuntu
containerid=52bbc9b30557

開始コンテナ:

docker start 52bbc9b30557

コンテナーを実行し続けるためにbashを開始します。

docker exec -it 52bbc9b30557 bash

必要な開始プロセス:

docker exec -it 52bbc9b30557 /path_to_cool_your_app

1

Dockerfileの最後でCMDを使用している場合は、最後にコードを追加することができます。これは、DockerがUbuntuで構築されている場合、またはbashを使用できるOSでのみ機能します。

&& /bin/bash

簡単に言うと、Dockerfileの最後は次のようになります。

...

CMD ls && ... && /bin/bash

したがって、Dockerイメージを実行した後に何かが自動的に実行されている場合、タスクが完了すると、bashターミナルがdocker内でアクティブになります。これにより、シェルコマンドを入力できます。


1

インタラクティブモードでdockerを実行すると、問題が解決する場合があります。

インタラクティブモードを使用した場合と使用しない場合の実行イメージの例を次に示します

chaitra @ RSK-IND-BLR-L06:〜/ dockers $ sudo docker run -d -t -i test_again1.0 b6b9a942a79b1243bada59db19c7999cfff52d0a8744542fa843c95354966a18

chaitra @ RSK-IND-BLR-L06:〜/ dockers $ sudo docker ps

コンテナーIDイメージコマンド作成されたステータスポート名

chaitra @ RSK-IND-BLR-L06:〜/ dockers $ sudo docker run -d -t -i test_again1.0 bash c3d6a9529fd70c5b2dc2d7e90fe662d19c6dad8549e9c812fb2b7ce2105d7ff5

chaitra @ RSK-IND-BLR-L06:〜/ dockers $ sudo docker ps

コンテナーIDイメージコマンド作成されたステータスポート名c3d6a9529fd7 test_again1.0 "bash" 2秒前1秒前awesome_haibt


0

コンテナを操作する場合は、フォアグラウンドで実行して、コンテナを存続させる必要があります。


-1

引数の順序が重要

Jersey Beansの回答(3つの例すべて)がうまくいきました。かなりの試行錯誤の末、私は議論の順序が重要であることに気づきました。

コンテナをバックグラウンドで実行し続けます: docker run -t -d <image-name>

コンテナをフォアグラウンドで実行し続けます: docker run <image-name> -t -d

Powershellのバックグラウンドから来たことは私には明らかではありませんでした。

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