次のように構成された(Debian)DockerコンテナのPIDファイルで問題が発生しました。--restart always
問題をまとめてみてください。
apache2
コンテナからサービスを開始します。 init サービスは PID ファイルを生成します。/var/run/apache2/apache2.pid
- 私の
docker kill
コンテナがホストの不適切なシャットダウン(電気的故障)をシミュレートし、サービスが異常終了したため、PIDファイルはまだ存在していました。 - コンテナを再起動し(ホストの再起動シミュレーション)、
apache2
サービスを再起動してみました。 PIDが再利用されると(他のプログラムがhttpdが実行されているPIDを使用している場合)、サービスの起動は失敗します。
サービスを正しく開始するには、次の手順を実行する必要があります。
- 運が良ければ、リサイクルされたPIDが公開されます。
- PIDファイルを手動で削除
明らかに、解決策1は解決策ではありません。
解決策2は何度も言及されていますが、コンテナから始まるすべてのサービスに対してエントリポイントまたはcmdでこれを行うことに関連しているので、私の考えでは解決策ではありません。また、特定の画像がPIDファイルを使用しますが、仮定が正しくない可能性があることも知っています。
いくつかの改善点を見ることができます。
/var/run
揮発性(tmpfs)またはOSの起動時にクリーンアップされ、コンテナの起動時にすべてをrmできます(すでに特定のPIDファイルを削除するよりも優れています)。/var/run
次へインストール一時ファイルシステムコンテナの起動時にクリーンアップされるようにコンテナを作成するとき
tmpfsソリューションは私にとって完璧に動作するようです(本当ですか?)。したがって、これをすべてのコンテナ配布(docker、docker composeなど)に適用できる体系的なソリューションがあるのか、欠点があるのか疑問に思います。毎回?なぜなら、私の考えでは、これをすべてのコンテナ配布に永久に適用する必要があり、可能であれば明示的にこれをやりたくないからです。