0
votes

Comment activer le flux de changement dans l'image docker pour MongoDB 3.6?

J'utilise le flux de modification MongoDB dans mon code et je dois créer une image docker MongoDB avec le flux de modification activé. Le problème est que mongod doit être démarré en premier avec les paramètres par défaut pour permettre de créer des utilisateurs, des documents, etc. Alors mongod devrait être arrêté. Ensuite, le jeu de répliques doit être ajouté au mongod.conf pour activer le flux de changement:

> backend@1.0.0 start /usr/src/app
> npm run babelserver

> backend@1.0.0 babelserver /usr/src/app
> babel-node --presets es2015 index.js

(node:41) UnhandledPromiseRejectionWarning: MongoError: not master and slaveOk=false
    at queryCallback (/usr/src/app/node_modules/mongodb-core/lib/cursor.js:248:25)
    at /usr/src/app/node_modules/mongodb-core/lib/connection/pool.js:532:18
    at processTicksAndRejections (internal/process/task_queues.js:82:9)
(node:41) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)

Après cela, mongod doit être redémarré et le jeu de répliques initialisé par le shell MongoDB:

RUN mongod --fork --config /etc/mongod.conf \
     && mongo < /opt/init_mongodb.js \
     && mongod --shutdown --dbpath /var/lib/mongodb \
     && cp /etc/mongod.conf /etc/mongod.conf.orig \
     && mongod --fork --config /opt/mongod.conf \
     && mongo -u "root" -p "root" --authenticationDatabase "admin" <  /opt/reconfig_mongodb.js \

MogodDB 3.6 image de base fournit une capacités d'initialisation. Savez-vous comment démarrer mongod, initialiser DB puis l'arrêter et reconfigurer?

UPD: J'ai besoin d'initialiser la base de données puis d'ajouter un jeu de répliques. Par conséquent, je dois exécuter le mongod avec le mongod.conf par défaut, créer des utilisateurs et des collections, puis redémarrer le mongod avec un autre mongod, conf dans lequel le jeu de répliques est activé. Je ne peux pas faire cela avec l'image officielle MongoDB. J'ai installé MongoDB 3.6.12 sur l'image Ubuntu. Mon conteneur MongoDB fonctionne bien après avoir exécuté les commandes de configuration manuellement dans son shell bash, mais les mêmes instructions ne fonctionnent pas à partir de Dockerfile Voici les commandes

rs.slaveOk()
rs.initiate()
rs.initiate({_id:"rs0", members: [{"_id":1, "host":"127.0.0.1:27017"}]})

Lorsque vous exécutez ces commandes depuis Dockerfile, l'erreur suivante apparaît

# mongod.conf
replication:
  replSetName: rs0
  oplogSizeMB: 100


3 commentaires

Pas votre manière mentionnée, mais mon répertoire /docker-entrypoint-initdb.d 'résout votre problème. Voir: hub.docker.com/_/mongo


J'ai essayé cette image, mais on dirait qu'elle ne permet pas de redémarrer mongod avec mongod.conf personnalisé


/docker-entrypoint-initdb.d ne s'exécutera qu'au premier démarrage du conteneur (pas de redémarrage). Et à partir du fichier Lisez-moi de Docker Hub: " mongod ne lit pas un fichier de configuration par défaut, donc l'option --config avec le chemin du fichier de configuration doit être spécifiée"


3 Réponses :


0
votes

Résolu en initialisant le jeu de réplicas au démarrage du conteneur. Ce script est défini comme ENTRYPOINT dans le fichier docker

rs.slaveOk()
rs.initiate()
rs.initiate({_id:"rs0", members: [{"_id":1, "host":"127.0.0.1:27017"}]})

replica.js

#!/bin/sh
# start mongod, initialize replica set
mongod --fork --config /opt/mongod.conf
mongo --quiet < /opt/replica.js
# restart mongod    
mongod --shutdown --dbpath /var/lib/mongodb
mongod --config /opt/mongod.conf


1 commentaires

Pourquoi appelez-vous rs.initiate () deux fois? Ne devrait-il pas non plus être _id: 0 pour un jeu de réplicas à un seul nœud?



2
votes

Je ne pense pas que ce soit une manière propre de configurer votre jeu de répliques. Cela devrait vraiment être beaucoup plus simple.

Au lieu d'exécuter l'un des membres en arrière-plan, de configurer le réplicaset, d'enregistrer le fichier de configuration, d'arrêter le processus et, enfin, de commencer par le fichier de configuration enregistré, vous pouvez simplement exécuter un autre Conteneur "helper" (également une image mongodb) dont le seul but est de configurer l'ensemble de répliques mongodb sans agir en tant que membre.

Quelque chose de similaire ferait l'affaire:

docker-compose.yaml final

#!/bin/sh

if [ -z "$PRIMARY" ]; then
  # Member container 
  docker-entrypoint.sh --replSet rs0 --smallfiles --oplogSize 128 --port "${PORT-27017}"
else
  # Replicator container
  until mongo "$PRIMARY" /app/replicaset-setup.js; do
      sleep 10
  done

fi

et dans container_start.sh

version: '3'
services:
  mongodb-rs0-1:
    image: ${your_image}
    ports: [27018:27018]
    environment:
      - PORT=27018
      - MONGO_RS=rs0/mongodb-rs0-1:27018,mongodb-rs0-2:27019,mongodb-rs0-3:27020
    volumes:
    - ./db/rs0-1:/data/db
  mongodb-rs0-2:
    image: ${your_image}
    ports: [27019:27019]
    environment:
      - PORT=27019
      - MONGO_RS=rs0/mongodb-rs0-1:27018,mongodb-rs0-2:27019,mongodb-rs0-3:27020
    volumes:
    - ./db/rs0-2:/data/db
  mongodb-rs0-3:
    image: ${your_image}
    ports: [27020:27020]
    environment:
      - PORT=27020
      - MONGO_RS=rs0/mongodb-rs0-1:27018,mongodb-rs0-2:27019,mongodb-rs0-3:27020
    volumes:
    - ./db/rs0-3:/data/db
  mongodb-replicator:
    image: ${your_image}
    environment:
      - PRIMARY=mongodb-rs0-1:27018
    depends_on:
      - mongodb-rs0-1
      - mongodb-rs0-2
      - mongodb-rs0-3
networks:
  default:
    external:
      name: mongo


0 commentaires

1
votes

Même si cela m'a pris des heures à comprendre, il est en fait assez facile de configurer une instance mongodb dockerisée avec la réplication activée (ce qui permet l'utilisation de flux de modifications.)

Mettez les deux dans le même dossier: p>

Dockerfile

rs.initiate({'_id':'rs0', members: [{'_id':1, 'host':'127.0.0.1:27017'}]});

init_replicaset.js

FROM mongo:4.4
ADD ./init_replicaset.js /docker-entrypoint-initdb.d/init_replicaset.js
CMD ["mongod", "--replSet", "rs0", "--bind_ip_all"]

Remarque : Tous les fichiers .js / .sh du répertoire /docker-entrypoint-initdb.d sont automatiquement exécutés lorsque l'instance mongo est initialisée, c'est pourquoi cela fonctionne.

À partir du même dossier, exécutez la commande suivante:

docker build. -t mongo_repl

docker run -i -p 27017: 27017 mongo_repl

Voilà! Vous devriez maintenant avoir une instance mongodb en cours d'exécution avec la réplication activée.


0 commentaires