MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come eseguire un comando una volta in Docker Compose

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