Sugiero agregar un script de punto de entrada a su contenedor; en este script de punto de entrada, puede verificar si la base de datos se ha inicializado y, de no ser así, realizar los pasos necesarios.
Como notó en su pregunta, el orden en que se inician los servicios/contenedores no debe darse por sentado, por lo que es posible que el contenedor de su aplicación se inicie antes el contenedor de la base de datos, por lo que el script debe tener eso en cuenta.
Como ejemplo, eche un vistazo a la imagen oficial de WordPress, que realiza una inicialización única de la base de datos en su script de punto de entrada. El script intenta conectarse a la base de datos (y lo vuelve a intentar si no se puede contactar con la base de datos (todavía)), y comprueba si es necesaria la inicialización; https://github.com /docker-library/wordpress/blob/df190dc9c5752fd09317d836bd2bdcd09ee379a5/apache/docker-entrypoint.sh#L146-L171
NOTA
Observé que creó un "contenedor de solo datos" para adjuntar su volumen. Desde docker 1.9, docker tiene administración de volúmenes, incluidos los volúmenes de nombres. Debido a esto, ya no necesita usar contenedores "solo de datos".
Puede eliminar el contenedor de solo datos de su archivo de redacción y cambiar su servicio mongo para que se vea así;
mongo:
image: mongo:latest
volumes:
- mongodata:/data/db
ports:
- "28001:27017"
command: --smallfiles --rest --auth
Esto debería crear un nuevo volumen, llamado mongodata
si no existe, o reutilice el volumen existente con ese nombre. Puede listar todos los volúmenes usando docker volume ls
y elimine un volumen con docker volume rm <some-volume>
si ya no lo necesitas