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

问题描述 投票:0回答:1

我正在努力使用 MongoDB 和 Node.js 应用程序设置 Docker 化环境。我的目标是通过 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: root
      MONGO_INITDB_ROOT_PASSWORD: rootpassword
    ports:
      - "27017:27017"

  nodejs:
    build: .
    depends_on:
      - mongodb

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


FROM node:14

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 中创建。

有人遇到过类似的问题或者可以指出我可能做错了什么吗?任何帮助或建议将不胜感激!

从代码中,如果我尝试不使用用户和密码,它就会连接,但我不想单独设置该用户和密码,因为我已经准备好来自不同 ENV_NAME.env 文件的这些信息,我希望这个 node.js 应用程序应该连接并做好它的工作。如果这种方式不可能,请让我知道其他过程。

node.js database mongodb docker nosql
1个回答
0
投票

您的连接字符串错误,这是正确的:

const url = "mongodb://root:rootpassword@mongodb:27017"
  • docker-compose.yaml
    文件中设置的实际用户名/密码是
    root:rootpassword
    ,而不是
    myuser:mypassword
  • mydb
    还没有退出

我已经设法使用固定URL +来自官方文档的示例代码来连接和列出数据库,所以我觉得你的代码仍然有问题,比如缺少async/await。我不是 Javascript 专家,所以我会让你弄清楚这一点:)

不相关,但您应该升级 Dockerfile 中的 Node 版本。不再支持 Node 14,也许升级到 20。

© www.soinside.com 2019 - 2024. All rights reserved.