sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo ejecutar un comando una vez en Docker compose

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