Docker Compose无法为Node.js容器连接创建MongoDB用户

vaj7vani  于 5个月前  发布在  Docker
关注(0)|答案(1)|浏览(74)

我正在使用MongoDB和Node.js应用程序设置一个Dockerized环境。我的目标是通过docker-compose.yml创建一个带有密码的MongoDB用户,Node.js应用程序可以使用该密码连接到MongoDB容器。然而,我遇到了用户和密码似乎没有创建的问题,阻止了我的Node.js应用程序建立与MongoDB的连接。
下面是我如何设置我的docker-compose.yml、Dockerfile和MongoDB初始化脚本:
docker-compose.yml:

version: '3.1'

services:
  mongodb:
    image: mongo
    environment:
      MONGO_INITDB_ROOT_USERNAME: myuser
      MONGO_INITDB_ROOT_PASSWORD: mypassword
      MONGO_INITDB_DATABASE: mydb
    ports:
      - "27017:27017"

  nodejs:
    build: .
    depends_on:
      - mongodb

字符串
Dockerfile(用于Node.js应用程序):

FROM node:21

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 8080
CMD [ "node", "app.js" ]


Node.js连接(app.js):

const MongoClient = require('mongodb').MongoClient;
const url = "mongodb://myuser:mypassword@mongodb:27017/mydb";

function connectWithRetry() {
  MongoClient.connect(url, {}, function(err, db) {
    if (err) {
      console.error('Failed to connect to mongo on startup - retrying in 5 sec', err);
      setTimeout(connectWithRetry, 5000);
    } else {
      
      var dbo = db.db("mydb");
      var myobj = { name: "John Doe", address: "Highway 37" };
      
      dbo.collection("users").insertOne(myobj, function(err, res) {
        if (err) throw err;
        console.log("1 document inserted");
        
        dbo.collection("users").findOne({}, function(err, result) {
          if (err) throw err;
          console.log(result.name);
          db.close();
        });
      });


    }
  });
}

connectWithRetry();


当我运行docker-compose up时,MongoDB容器启动,但Node.js应用程序无法连接到数据库,并显示MongoNetworkError。似乎用户和密码没有按预期在MongoDB中创建。
有没有人遇到过类似的问题,或者可以指出我可能做错了什么?任何帮助或建议将不胜感激!
从代码中,如果我尝试wihtout使用用户名和密码,它正在连接,但我不想单独设置用户名和密码,因为我已经准备好了来自不同ENV_NAME.env文件的信息,我希望这个node.js应用程序应该连接并完成它的工作。如果不可能这样做,那么让我知道其他过程。

thtygnil

thtygnil1#

您可以在数据库的日志中找到错误:

{
   ...
   "msg":"Failed to authenticate",
   "attr":{
      "user":"myuser",
      "db":"mydb",
      "error":"UserNotFound: Could not find user \"myuser\" for db \"mydb\"",
   }
   ...
}

字符串
根据the documentation,第 MONGO_INITDB_ROOT_USERNAME**MONGO_INITDB_ROOT_PASSWORD 节:
该用户在管理员身份验证数据库中创建,并被赋予root角色,即“超级用户”角色。
因此,如果你想连接到mydb数据库,你需要在Mongo容器内的/docker-entrypoint-initdb.d文件夹下创建一个Mongo脚本,为该数据库创建一个用户(为此使用卷):该脚本看起来像这样:

db.createUser(
  {
    user: 'mydbuser',
    pwd: 'mydbpassword',
    roles: [{ role: 'readWrite', db: 'mydb' }],
  },
);


然后,编辑代码中的连接脚本以:

const url = "mongodb://mydbuser:mydbpassword@mongodb:27017/mydb";

相关问题