使用docker-compose部署Node-Express-Mongo应用时Mongo认证失败
MongoDB+Express 容器化部署认证失败问题
我以Node+Express模板搭建MongoDB+Express HTTP服务器,修改后的docker-compose.yml配置如下:
version: "3.8" services: database: image: mongo container_name: mongo-database restart: always volumes: - "mongodata:/data/db" ports: - "27017:27017" environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: example mongo-express: image: mongo-express container_name: mongo-express restart: always ports: - "8081:8081" environment: ME_CONFIG_MONGODB_ADMINUSERNAME: root ME_CONFIG_MONGODB_ADMINPASSWORD: example ME_CONFIG_MONGODB_SERVER: mongo-database web: image: node:16-alpine container_name: node-server restart: always user: "node" ports: - "9443:443" volumes: - "./app:/var/app/" working_dir: "/var/app" environment: NODE_ENV: dev DB_USER: root DB_PASSWORD: example DB_NAME: mongo-database command: "./wait.sh mongo-database 27017 'npm start'" volumes: mongodata:
执行docker compose up -d后,node-server容器日志出现认证失败错误:
Mongo started MongoError: Authentication failed. at MessageStream.messageHandler (/var/app/node_modules/mongodb/lib/cmap/connection.js:272:20) at MessageStream.emit (node:events:513:28) at processIncomingData (/var/app/node_modules/mongodb/lib/cmap/message_stream.js:144:12) at MessageStream._write (/var/app/node_modules/mongodb/lib/cmap/message_stream.js:42:5) at writeOrBuffer (node:internal/streams/writable:391:12) at _write (node:internal/streams/writable:332:10) at MessageStream.Writable.write (node:internal/streams/writable:336:10) at Socket.ondata (node:internal/streams/readable:754:22) at Socket.emit (node:events:513:28) at addChunk (node:internal/streams/readable:315:12) { ok: 0, code: 18, codeName: 'AuthenticationFailed' }
我已在web服务中配置了与数据库服务匹配的DB_USER、DB_PASSWORD,将DB_NAME设为数据库服务名mongo-database,为何仍出现Mongo认证失败?
问题解决
核心问题是环境变量的含义误解,以及连接配置缺失:
环境变量命名错误
你把DB_NAME设为Docker数据库服务名mongo-database,但这个变量应该指代要连接的MongoDB数据库实例名称,而不是容器服务名。root用户默认在admin数据库下创建,认证时需要指定该库。缺少数据库地址配置
需要新增环境变量指定数据库服务的Docker内部主机名(即容器间通信的地址),比如DB_HOST。
具体修正步骤:
- 修改docker-compose.yml的web服务环境变量:
environment: NODE_ENV: dev DB_USER: root DB_PASSWORD: example DB_HOST: mongo-database # Docker内部的数据库服务主机名 DB_NAME: admin # root用户对应的认证数据库
- 调整Node应用的数据库连接代码:
确保连接字符串包含认证源指定,示例如下:
const mongoUri = `mongodb://${process.env.DB_USER}:${process.env.DB_PASSWORD}@${process.env.DB_HOST}:27017/${process.env.DB_NAME}?authSource=admin`;
- 清理旧数据卷(可选):
如果之前创建过mongodata卷,可能残留旧的认证数据,执行以下命令重置:
docker compose down -v docker compose up -d
内容的提问来源于stack exchange,提问作者ChristianOConnor
相关产品推荐
相关产品推荐

