我正在使用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应用程序应该连接并完成它的工作。如果不可能这样做,那么让我知道其他过程。
1条答案
按热度按时间thtygnil1#
您可以在数据库的日志中找到错误:
字符串
根据the documentation,第 MONGO_INITDB_ROOT_USERNAME**MONGO_INITDB_ROOT_PASSWORD 节:
该用户在管理员身份验证数据库中创建,并被赋予root角色,即“超级用户”角色。
因此,如果你想连接到
mydb
数据库,你需要在Mongo容器内的/docker-entrypoint-initdb.d
文件夹下创建一个Mongo脚本,为该数据库创建一个用户(为此使用卷):该脚本看起来像这样:型
然后,编辑代码中的连接脚本以:
型