首页 > 解决方案 > 如何在同一个 docker compose 中使用两个 mongodb 实例

问题描述

我的 docker compose 文件如下所示:

version: '3.9'

# Services
services:
    service-one:
        ....
        environment:
           STOCK_DB: stock
           STOCK_USER: appUser
           STOCK_PASS: appPass
           STOCK_PORT: 27020
           STOCK_HOST: mongo-db-one
        networks:
           - backend
        ....
    service-two:
        ....
        environment:
           STOCK_DB: stock
           STOCK_USER: appUser
           STOCK_PASS: appPass
           STOCK_PORT: 27021
           STOCK_HOST: mongo-db-two
        networks:
           - backend
        ....
    mongo-db-one:
        build:
           context: ./mongoDb-config
           dockerfile: Dockerfile-one
        image: mongo-db-one
        container_name: mongo-db-one
        ports:
           - :27020
        environment:
           MONGO_INITDB_DATABASE: stock
           MONGO_INITDB_ROOT_USERNAME: appUser
           MONGO_INITDB_ROOT_PASSWORD: appPass
        entrypoint: ["mongod","--config","/etc/mongod.conf"]
        networks:
          - backend
    mongo-db-two:
        build:
           context: ./mongoDb-config
           dockerfile: Dockerfile-two
        image: mongo-db-two
        container_name: mongo-db-two
        ports:
           - :27021
        environment:
           MONGO_INITDB_DATABASE: stock
           MONGO_INITDB_ROOT_USERNAME: appUser
           MONGO_INITDB_ROOT_PASSWORD: appPass
        entrypoint: ["mongod","--config","/etc/mongod.conf"]
        networks:
          - backend

现在我的 mongo 配置文件是:

对于 mongo-one.conf:

net:
    port: 27020
    bindIp: 0.0.0.0

对于 mongo-two.conf:

net:
    port: 27021
    bindIp: 0.0.0.0

Dockerfile-一:

FROM mongo:latest
ADD mongo-init.js /docker-entrypoint-initdb.d/mongo-init.js
ADD ./mongo-one.conf /etc/mongod.conf

Dockerfile-二:

FROM mongo:latest
ADD mongo-init.js /docker-entrypoint-initdb.d/mongo-init.js
ADD ./mongo-two.conf /etc/mongod.conf

我的 mongo-init.js:

db.createUser(
    {
        user: "appUser",
        pwd: "appPass",
        roles: [
            {
                role: "readWrite",
                db: "stock"
            }
        ]
    }
);

我在这里创建两个实例,它们将被两个不同的服务使用。两个 mongodbs 都会有一个数据库“股票”。

mongo db 都已启动,但是当服务 service-one 和 service-two 尝试查询 mongo dbs 时,它们会给出以下错误:

{"t":{"$date":"2021-06-04T07:20:25.033+00:00"},"s":"I", "c":"ACCESS", "id":20249, "ctx":"conn2","msg":"Authentication failed","attr":{"mechanism":"SCRAM-SHA-1",
"speculative":false,"principalName":"appUser","authenticationDatabase":"stock","remote":"192.168.16.13:36310","extraInfo":{},"error":"UserNotFound: Could not find user \"appUser\" for db \"stock\""}}

service-one 和 service-two 都是 spring boot 应用程序,它们在 application.properties 中使用以下属性:


# Data source
spring.data.mongodb.authentication-db=${STOCK_DB}
spring.data.mongodb.username=${STOCK_USER}
spring.data.mongodb.password=${STOCK_PASS}
spring.data.mongodb.database=${STOCK_DB}
spring.data.mongodb.port=${STOCK_PORT}
spring.data.mongodb.host=${STOCK_HOST}

我需要知道错误是什么。另外,我必须使用两个不同的 mongo 实例,这是强制性要求。

标签: springmongodbspring-bootdockerdocker-compose

解决方案


推荐阅读