Jag föreslår att du lägger till ett entrypoint-script till din behållare; i detta entrypoint-script kan du kontrollera om databasen har initierats, och om den inte är det, utför de nödvändiga stegen.
Som du märkte i din fråga bör ordningen i vilken tjänster/behållare startas inte tas för given, så det är möjligt att din applikationsbehållare startas före databasbehållaren, så skriptet bör ta hänsyn till det.
Som ett exempel, ta en titt på den officiella WordPress-bilden, som utför en engångsinitiering av databasen i dess entrypoint-script. Skriptet försöker ansluta till databasen (och försöker igen om databasen inte kan kontaktas (ännu)), och kontrollerar om initiering behövs; https://Lgithub.com /docker-library/wordpress/blob/df190dc9c5752fd09317d836bd2bdcd09ee379a5/apache/docker-entrypoint.sh#L146-L171
OBS
Jag märker att du skapade en "endast databehållare" för att koppla din volym till. Sedan docker 1.9 har docker volymhantering, inklusive namngivning av volymer. På grund av detta behöver du inte längre använda "endast data"-behållare.
Du kan ta bort behållaren för endast data från din skrivfil och ändra din mongo-tjänst så att den ser ut ungefär så här;
mongo:
image: mongo:latest
volumes:
- mongodata:/data/db
ports:
- "28001:27017"
command: --smallfiles --rest --auth
Detta bör skapa en ny volym, med namnet mongodata
om den inte finns, eller återanvänd den befintliga volymen med det namnet. Du kan lista alla volymer med docker volume ls
och ta bort en volym med docker volume rm <some-volume>
om du inte längre behöver det