我想创建一个带有Mongo示例的Docker容器。特别是,我想创建一个只有一个节点的副本集(因为我对事务感兴趣,而事务只适用于副本集)。
停靠文件
FROM mongo
RUN echo "rs.initiate();" > /docker-entrypoint-initdb.d/replica-init.js
CMD ["--replSet", "rs0"]
docker-compose.yml
version: "3"
services:
db:
build:
dockerfile: Dockerfile
context: .
ports:
- "27017:27017"
如果我单独使用Dockerfile,一切正常,而如果我使用docker-compose,它就不工作了:事实上,如果我随后登录到容器,我会得到提示为rs0:OTHER>
而不是rs0:PRIMARY>
。
我查阅了这些链接,但提出的解决方案不起作用:
https://github.com/docker-library/mongo/issues/246#issuecomment-382072843https://github.com/docker-library/mongo/issues/249#issuecomment-381786889
7条答案
按热度按时间2admgd591#
这是我在本地开发中使用了一段时间的合成文件,如果你不需要通过SSL连接,你可以删除
keyfile
部分。如果
rs.initiate()
在运行后确实需要,它会使用Docker的健康检查(带有启动延迟)偷偷地进入rs.initiate()
。创建密钥文件。
麦克:
Linux操作系统:
k97glaaz2#
上面的答案在后来的MongoDB和Docker版本中不再适用。特别是因为如果副本集已经初始化,
rs.initiate().ok
会抛出一个错误,导致整个命令失败。此外,从另一个容器连接失败,因为副本集的唯一成员有一些随机主机,这将不允许连接。下面是我的新docker-compose.yml
:在
./mongo/
中,我有一个定制的Dockerfile
,如下所示:这个
Dockerfile
适合于开发,但是您肯定希望在生产中挂载一个安全生成的持久性keyfile
(因此删除整个RUN
命令)。qcbq4gxm3#
即使RS中只有一个节点,您仍然需要发出replSetInitiate。
另见此处。
yfwxisqw4#
我不得不围绕ChangeStreams做一些类似的测试,这些测试只有在将mongo作为副本集运行时才可用。我不记得我是从哪里得到这个的,所以我不能详细解释它,但它确实对我有用。下面是我的设置:
运行
docker-compose up
,你应该很好。连接字符串:
mongodb://admin:pass@localhost:27017/test
注:显然,您不应该在生产中使用此功能,如果安全性是一个问题,请调整Dockerfile中的键"12345678"。
wljmcqd85#
我无法让这些例子中的任何一个工作,所以在谷歌上搜索了几个小时之后,我终于找到了一些对我的本地开发来说足够好的东西,它不需要授权。这可能会破坏你的交易,但它看起来确实像一个复制集一样工作--所以事务看起来像预期的那样工作。
无论如何,只要用你想要的数据库名称替换
YOUR_DB_NAME_HERE
就可以了。我在启动时在这个数据库中创建了一个init集合,但是如果它不能满足你的需要,你可以在localdev-mongo服务入口点中删除这段代码;只是确保不要删除rs.initiate脚本/调用,因为这是初始化副本集所必需的。snz8szmq6#
如果您只需要通过docker-compose.yml创建MongoDB的单节点副本集,您可以简单地使用以下命令:
pod7payv7#
这一个对我来说很好: