我正在努力使用 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 应用程序应该连接并做好它的工作。如果这种方式不可能,请让我知道其他过程。
您的连接字符串错误,这是正确的:
const url = "mongodb://root:rootpassword@mongodb:27017"
docker-compose.yaml
文件中设置的实际用户名/密码是root:rootpassword
,而不是myuser:mypassword
。mydb
还没有退出我已经设法使用固定URL +来自官方文档的示例代码来连接和列出数据库,所以我觉得你的代码仍然有问题,比如缺少async/await。我不是 Javascript 专家,所以我会让你弄清楚这一点:)
不相关,但您应该升级 Dockerfile 中的 Node 版本。不再支持 Node 14,也许升级到 20。