MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment exécuter une commande une fois dans Docker compose

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