Tengo un problema con MongoDB. Estoy aprovisionando el archivo config.js a docker-entrypoint-initdb.d en mi archivo docker-compose :
mongo: image: mongo:latest restart: always ports: - 27017:27017 environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: example MONGO_INITDB_DATABASE: dev volumes: - ./config.js:/docker-entrypoint-initdb.d/config.js - mongodbdata:/data/db El archivo config.js se ve así:
db.auth('root', 'example'); db = db.getSiblingDB('dev'); db.approver.insert({"email":"some@email.com,"approverType":"APPROVER"}); db.approver.insert({"email":"someother@email.com","approverType":"ACCOUNTANCY"}); Cuando ejecuto docker-compose up -d por primera vez, todo está bien, las dos entradas se insertan en la base de datos.
Pero luego, quiero agregar una tercera entrada y volver a crear el contenedor:
db.auth('root', 'example'); db = db.getSiblingDB('dev'); db.approver.insert({"email":"some@email.com,"approverType":"APPROVER"}); db.approver.insert({"email":"someother@email.com","approverType":"ACCOUNTANCY"}); db.approver.insert({"email":"another@email.com","approverType":"ACCOUNTANCY"}); docker-compose up -d --force-recreate --no-deps mongo no pasa nada. El contenedor se vuelve a crear, pero la tercera entrada no está allí.
Ejecutar docker exec -it dev_mongo_1 mongo docker-entrypoint-initdb.d/config.js devuelve:
MongoDB shell version v4.0.10 connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb Implicit session: session { "id" : UUID("d44b8e0a-a32c-4da0-a02b-c3f71d6073dd") } MongoDB server version: 4.0.10 Error: Authentication failed.¿Hay alguna manera de recrear el contenedor para que el script se vuelva a ejecutar? ¿O para ejecutar un comando mongo que volverá a ejecutar el script en un contenedor en ejecución?
En el script de inicio de mongodb, se verifica si se debe realizar la inicialización: https://github.com/docker-library/mongo/blob/40056ae591c1caca88ffbec2a426e4da07e02d57/3.6/docker-entrypoint.sh#L225
# check for a few known paths (to determine whether we've already initialized and should thus skip our initdb scripts) if [ -n "$shouldPerformInitdb" ]; then ... así que probablemente se haga solo una vez durante la inicialización de la base de datos y luego, mientras mantiene el estado de la base de datos usando mongodbdata:/data/db , no se inicializará.
Para solucionarlo, puede intentar escribir docker-compose down -v , lo que eliminará los datos de su base de datos y le permitirá ejecutar la inicialización una vez más.