You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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认证失败?


问题解决

核心问题是环境变量的含义误解,以及连接配置缺失:

  1. 环境变量命名错误
    你把DB_NAME设为Docker数据库服务名mongo-database,但这个变量应该指代要连接的MongoDB数据库实例名称,而不是容器服务名。root用户默认在admin数据库下创建,认证时需要指定该库。

  2. 缺少数据库地址配置
    需要新增环境变量指定数据库服务的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 08:10:24