【发布时间】:2019-05-11 03:53:29
【问题描述】:
我在我的代码中使用 MongoDB 更改流,需要创建一个启用更改流的 MongoDB docker 映像。 问题是应该首先使用默认设置启动 mongod 以允许创建用户、文档等。 然后应该停止mongod。然后应该将副本集添加到 mongod.conf 以启用更改流:
# mongod.conf
replication:
replSetName: rs0
oplogSizeMB: 100
之后应该再次启动 mongod 并由 MongoDB shell 初始化副本集:
rs.slaveOk()
rs.initiate()
rs.initiate({_id:"rs0", members: [{"_id":1, "host":"127.0.0.1:27017"}]})
MogodDB 3.6 base image 提供了初始化功能。 你知道如何启动 mongod,初始化 DB,然后停止它并重新配置吗?
更新: 我需要初始化数据库然后添加副本集。 因此,我需要使用默认的 mongod.conf 运行 mongod,创建用户和集合,然后使用另一个启用了副本集的 mongod、conf 重新启动 mongod。我不能用官方的 MongoDB 图像来做到这一点。我已经在 Ubuntu 映像上安装了 MongoDB 3.6.12。在 bash shell 中手动运行设置命令后,我的 MongoDB 容器运行良好,但相同的指令在 Dockerfile 中不起作用 这是命令
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 \
从 Dockerfile 运行此命令时,出现以下错误
> 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)
【问题讨论】:
-
不是你提到的方式,但我的
/docker-entrypoint-initdb.d' dir 解决了你的问题。见:hub.docker.com/_/mongo -
尝试了该图像,但看起来它不允许使用自定义 mongod.conf 重新启动 mongod
-
/docker-entrypoint-initdb.d只会在第一个容器启动时执行(不重启)。并且来自 Docker Hub 自述文件:“mongod默认不读取配置文件,因此需要指定带有配置文件路径的--config选项”
标签: mongodb docker docker-compose dockerfile changestream