Ik stel voor om een entrypoint-script toe te voegen aan je container; in dit entrypoint-script kunt u controleren of de database is geïnitialiseerd, en als dat niet het geval is, de vereiste stappen uitvoeren.
Zoals u in uw vraag hebt opgemerkt, moet de volgorde waarin services / containers worden gestart niet als vanzelfsprekend worden beschouwd, dus het is mogelijk dat uw toepassingscontainer voor is gestart de databasecontainer, dus het script moet daar rekening mee houden.
Bekijk als voorbeeld de officiële WordPress-afbeelding, die een eenmalige initialisatie van de database uitvoert in zijn entrypoint-script. Het script probeert verbinding te maken met de database (en probeert het opnieuw als de database (nog) niet kan worden bereikt), en controleert of initialisatie nodig is; https://github.com /docker-library/wordpress/blob/df190dc9c5752fd09317d836bd2bdcd09ee379a5/apache/docker-entrypoint.sh#L146-L171
OPMERKING
Ik zie dat je een "data-only container" hebt gemaakt om je volume aan te koppelen. Sinds docker 1.9 heeft docker volumebeheer, inclusief het benoemen van volumes. Hierdoor hoeft u niet langer "data-only" containers te gebruiken.
U kunt de container met alleen gegevens uit uw opstelbestand verwijderen en uw mongo-service er ongeveer zo uit laten zien;
mongo:
image: mongo:latest
volumes:
- mongodata:/data/db
ports:
- "28001:27017"
command: --smallfiles --rest --auth
Dit zou een nieuw volume moeten maken, genaamd mongodata
als het niet bestaat, of hergebruik het bestaande volume met die naam. U kunt alle volumes weergeven met docker volume ls
en verwijder een volume met docker volume rm <some-volume>
als je het niet langer nodig hebt