首页 > 解决方案 > 如何创建一个节点的 MongoDB 副本集并使用 docker_compose.yml 对其进行初始化

问题描述

我正在尝试使用 docker compose 创建一个带有 MongoDB 和 mongo-express 的 MongoDB 集群。我可以很好地创建集群,但我需要一个单节点副本集才能为我的应用程序启用更改流。目标是让 docker compose 在运行集群后无需进入 mongo shell 即可自动创建副本集。

我一直在努力寻找一个可行的例子。我发现的最好的在这里,但它不适合我。mongo 容器无法启动。

这是我的 docker_compose.yml 文件:

version: "3"

services:

  mongodb:
    image: mongo
    container_name: mongodb
    ports:
      - 27017:27017
    environment:
      - MONGO_INITDB_ROOT_USERNAME=rootuser
      - MONGO_INITDB_ROOT_PASSWORD=rootpass
    volumes:
      - ./.docker/mongodb/mongod.conf:/etc/mongod.conf
      - ./.docker/mongodb/initdb.d/:/docker-entrypoint-initdb.d/
      - ./.docker/mongodb/data/db/:/data/db/
      - ./.docker/mongodb/data/log/:/var/log/mongodb/
    healthcheck:
        test: test $$(echo "rs.initiate().ok || rs.status().ok" | mongo -u $${MONGO_INITDB_ROOT_USERNAME} -p $${MONGO_INITDB_ROOT_PASSWORD} --quiet) -eq 1
        interval: 10s
        start_period: 30s
    command: ["/usr/bin/mongod -f", "/etc/mongod.conf", "--replSet", "rs0", "--bind_ip_all"]

  mongo-express:
    image: mongo-express
    container_name: mongo-express
    ports:
      - 8081:8081
    environment:
      - ME_CONFIG_MONGODB_ADMINUSERNAME=rootuser
      - ME_CONFIG_MONGODB_ADMINPASSWORD=rootpass
      - ME_CONFIG_MONGODB_SERVER=mongodb

networks:
  default:
    name: mongo-express-network

volumes:
  mongodb-data:
    driver: local

魔术应该在command上面链接的帖子中,但我尝试过的任何方式都不起作用。如果我删除它,我会得到一个工作集群 mongo 和 mongo-express。但没有副本集。

顺便说一句,如果我进入 shell 并运行:

# mongod -f /etc/mongod.conf --replSet rs0 --bind_ip_all
Error opening config file: Is a directory
try 'mongod --help' for more information
#

mongod.conf位于其他地方吗?

任何有关使这项工作的帮助将不胜感激!

标签: javascriptnode.jsmongodbdockerreplicaset

解决方案


mkdir initdb.d 
echo 'rs.initiate()' |tee initdb.d/rs.js
docker run -itv `pwd`/initdb.d:/docker-entrypoint-initdb.d/:ro -p 27017:27017 mongo --replSet myrs --bind_ip_all

mongod.conf 是否位于其他地方?

图像上没有一个,所以如果你创建了它,它就会在你放置的任何地方。


推荐阅读