Suggerisco di aggiungere uno script entrypoint al tuo container; in questo script entrypoint, puoi verificare se il database è stato inizializzato e, in caso contrario, eseguire i passaggi richiesti.
Come hai notato nella tua domanda, l'ordine in cui i servizi/contenitori vengono avviati non dovrebbe essere dato per scontato, quindi è possibile che il tuo contenitore dell'applicazione sia stato avviato prima il contenitore del database, quindi lo script dovrebbe tenerne conto.
Ad esempio, dai un'occhiata all'immagine ufficiale di WordPress, che esegue un'inizializzazione una tantum del database nel suo script entrypoint. Lo script tenta di connettersi al database (e riprova se il database non può essere contattato (ancora)) e verifica se è necessaria l'inizializzazione; https://github.com /docker-library/wordpress/blob/df190dc9c5752fd09317d836bd2bdcd09ee379a5/apache/docker-entrypoint.sh#L146-L171
NOTA
Ho notato che hai creato un "contenitore di soli dati" a cui allegare il tuo volume. Dalla finestra mobile 1.9, la finestra mobile ha la gestione dei volumi, inclusi i volumi di denominazione. Per questo motivo, non è più necessario utilizzare contenitori "solo dati".
Puoi rimuovere il contenitore di soli dati dal tuo file di composizione e modificare il tuo servizio mongo in modo che assomigli a questo;
mongo:
image: mongo:latest
volumes:
- mongodata:/data/db
ports:
- "28001:27017"
command: --smallfiles --rest --auth
Questo dovrebbe creare un nuovo volume, chiamato mongodata
se non esiste, o riutilizza il volume esistente con quel nome. Puoi elencare tutti i volumi usando docker volume ls
e rimuovi un volume con docker volume rm <some-volume>
se non ne hai più bisogno