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

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

これまで読んだチュートリアルによると、「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

Centos ドッカーファイルにはデフォルトのコマンドがありますbash

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

2017年アップデート

最近のバージョンのDockerでは、分離モード そしてフォアグラウンドモード-t-iまたは-it

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

docker run -t -d centos

bashはバックグラウンドで待機します。
これは最初に報告されたものですカリャニ・チャウダリ答え詳細はジャージー豆答え

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

注意:高山マリノスアンレポートコメント欄:

docker run -t -d alpine/gitプロセスが維持されません。次のこと
を行う必要がありました。docker run --entrypoint "/bin/sh" -it alpine/git


元の回答 (2015)

前述の通りこの記事:

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

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

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

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

つまり、これは機能します:

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

または Dockerfile の場合:

ENTRYPOINT ["tail"]
CMD ["-f","/dev/null"]

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

そこから、それに付着したり、そこから外れたりする(またはdocker execいくつかのコマンド)。


しかし、ビクトルコメント:

エントリポイントをオーバーライドすると、何かが指定されている場合に Dockerfile が混乱します。
systemdこれは特に重要です。

テーリング/dev/nullもあまり説得力がありません。本質的には、完全に不必要なシステム コールでシステムを攻撃することになります。
もう一つの解決策睡眠をとると、見た目がずっと良くなります。

それはsleep infinity、GNU coreutilsの拡張は考慮されていないPOSIX

おすすめ記事