Предлагам да добавите скрипт на входна точка към вашия контейнер; в този скрипт за входна точка можете да проверите дали базата данни е инициализирана и ако не е, изпълнете необходимите стъпки.
Както забелязахте във въпроса си, редът, в който се стартират услугите/контейнерите, не трябва да се приема за даденост, така че е възможно контейнерът на вашето приложение да е стартиран преди контейнера на базата данни, така че скриптът трябва да вземе това предвид.
Като пример, погледнете официалното изображение на 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>
ако вече не ви трябва