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 Réponses :
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
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?
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
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.
Pas votre manière mentionnée, mais mon répertoire
/docker-entrypoint-initdb.d
'résout votre problème. Voir: hub.docker.com/_/mongoJ'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"