これまで読んだチュートリアルによると、「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 ps
Centos コンテナがまだ実行中であることを示します。
そこから、それに付着したり、そこから外れたりする(またはdocker exec
いくつかのコマンド)。
エントリポイントをオーバーライドすると、何かが指定されている場合に Dockerfile が混乱します。
systemd
これは特に重要です。テーリング
/dev/null
もあまり説得力がありません。本質的には、完全に不必要なシステム コールでシステムを攻撃することになります。
もう一つの解決策睡眠をとると、見た目がずっと良くなります。
それはsleep infinity
、GNU coreutilsの拡張は考慮されていないPOSIX。