Ich schlage vor, Ihrem Container ein Entrypoint-Skript hinzuzufügen; In diesem Entrypoint-Skript können Sie überprüfen, ob die Datenbank initialisiert wurde, und falls nicht, die erforderlichen Schritte ausführen.
Wie Sie in Ihrer Frage bemerkt haben, sollte die Reihenfolge, in der Dienste/Container gestartet werden, nicht selbstverständlich sein, daher ist es möglich, dass Ihr Anwendungscontainer vorher gestartet wird dem Datenbank-Container, also sollte das Skript das berücksichtigen.
Schauen Sie sich als Beispiel das offizielle WordPress-Image an, das in seinem Entrypoint-Skript eine einmalige Initialisierung der Datenbank durchführt. Das Skript versucht, sich mit der Datenbank zu verbinden (und versucht es erneut, wenn die Datenbank (noch) nicht kontaktiert werden kann) und prüft, ob eine Initialisierung erforderlich ist; https://github.com /docker-library/wordpress/blob/df190dc9c5752fd09317d836bd2bdcd09ee379a5/apache/docker-entrypoint.sh#L146-L171
HINWEIS
Mir ist aufgefallen, dass Sie einen "Nur-Daten-Container" erstellt haben, an den Sie Ihr Volume anhängen können. Seit Docker 1.9 verfügt Docker über eine Datenträgerverwaltung, einschließlich der Benennung von Datenträgern. Aus diesem Grund müssen Sie keine „Nur-Daten“-Container mehr verwenden.
Sie können den Nur-Daten-Container aus Ihrer Compose-Datei entfernen und Ihren Mongo-Dienst so ändern, dass er in etwa so aussieht:
mongo:
image: mongo:latest
volumes:
- mongodata:/data/db
ports:
- "28001:27017"
command: --smallfiles --rest --auth
Dadurch sollte ein neues Volume mit dem Namen mongodata
erstellt werden wenn es nicht existiert, oder verwenden Sie das vorhandene Volume mit diesem Namen erneut. Sie können alle Volumes mit docker volume ls
auflisten und entfernen Sie ein Volume mit docker volume rm <some-volume>
wenn Sie es nicht mehr benötigen