エントリポイントスクリプトをコンテナに追加することをお勧めします。このエントリポイントスクリプトでは、データベースが初期化されているかどうかを確認でき、初期化されていない場合は、必要な手順を実行します。
質問でお気づきのように、サービス/コンテナが開始される順序は当然のことと考えるべきではないため、アプリケーションコンテナが前に開始される可能性があります。 データベースコンテナなので、スクリプトはそれを考慮に入れる必要があります。
例として、エントリポイントスクリプトでデータベースの1回限りの初期化を実行する公式のWordPressイメージを見てください。スクリプトはデータベースへの接続を試み(データベースに(まだ)接続できない場合は再試行し)、初期化が必要かどうかを確認します。 https://github.com /docker-library/wordpress/blob/df190dc9c5752fd09317d836bd2bdcd09ee379a5/apache/docker-entrypoint.sh#L146-L171
注
ボリュームを接続するための「データ専用コンテナ」を作成したようです。 docker 1.9以降、dockerにはボリュームの命名を含むボリューム管理があります。このため、「データのみ」のコンテナを使用する必要がなくなりました。
作成ファイルからデータ専用コンテナを削除し、mongoサービスを次のように変更できます。
mongo:
image: mongo:latest
volumes:
- mongodata:/data/db
ports:
- "28001:27017"
command: --smallfiles --rest --auth
これにより、mongodata
という名前の新しいボリュームが作成されます。 存在しない場合は、その名前の既存のボリュームを再利用します。 docker volume ls
を使用してすべてのボリュームを一覧表示できます docker volume rm <some-volume>
を使用してボリュームを削除します 不要になった場合