Je suggère d'ajouter un script de point d'entrée à votre conteneur ; dans ce script de point d'entrée, vous pouvez vérifier si la base de données a été initialisée, et si ce n'est pas le cas, effectuez les étapes requises.
Comme vous l'avez remarqué dans votre question, l'ordre dans lequel les services/conteneurs sont démarrés ne doit pas être pris pour acquis, il est donc possible que votre conteneur d'application soit démarré avant le conteneur de la base de données, le script doit donc en tenir compte.
À titre d'exemple, jetez un œil à l'image officielle de WordPress, qui effectue une initialisation unique de la base de données dans son script de point d'entrée. Le script tente de se connecter à la base de données (et réessaye si la base de données ne peut pas (encore) être contactée) et vérifie si une initialisation est nécessaire ; https://github.com /docker-library/wordpress/blob/df190dc9c5752fd09317d836bd2bdcd09ee379a5/apache/docker-entrypoint.sh#L146-L171
REMARQUE
Je remarque que vous avez créé un "conteneur de données uniquement" auquel attacher votre volume. Depuis docker 1.9, docker a la gestion des volumes, y compris la dénomination des volumes. Pour cette raison, vous n'avez plus besoin d'utiliser des conteneurs "données uniquement".
Vous pouvez supprimer le conteneur de données uniquement de votre fichier de composition et modifier votre service mongo pour qu'il ressemble à ceci ;
mongo:
image: mongo:latest
volumes:
- mongodata:/data/db
ports:
- "28001:27017"
command: --smallfiles --rest --auth
Cela devrait créer un nouveau volume, nommé mongodata
s'il n'existe pas, ou réutilisez le volume existant avec ce nom. Vous pouvez lister tous les volumes en utilisant docker volume ls
et supprimer un volume avec docker volume rm <some-volume>
si vous n'en avez plus besoin