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

Docker Compose环境Mongoose连接MongoDB报认证失败问题排查

问题描述

尝试连接db容器的MongoDB实例时持续触发如下错误:

MongoServerError: Authentication failed.

当前docker-compose.yml配置如下:

version: '3'

services:

  app:
    container_name: ${APP_NAME}_app
    build:
      context: .
    ports:
      - "8088:3001"
    depends_on:
      - db
    environment:
      - DB_HOST=db
      - DB_PORT=${DB_PORT}
      - DB_NAME=${DB_NAME}
      - DB_USER=${DB_USER}
      - DB_PASSWORD=${DB_PASSWORD}

  db:
    container_name: ${APP_NAME}_db
    image: mongo
    volumes:
      - ./data:/data/db
    ports:
      - "${DB_PORT}:${DB_PORT}"
    environment:
      - MONGO_INITDB_ROOT_USERNAME=${DB_USER}
      - MONGO_INITDB_ROOT_PASSWORD=${DB_PASSWORD}
      - MONGO_INITDB_DATABASE=${DB_NAME}

.env文件配置变量如下:

DB_PORT=27017
DB_NAME=mydb
DB_USER=root
DB_PASSWORD=mypwd

数据库连接类代码如下:

import * as Mongoose from 'mongoose'
import { UserModel } from './users/users.model'
import { ChatModel } from './chats/chats.model'
import { MessageModel } from './messages/messages.model'

const {
    DB_HOST,
    DB_PORT,
    DB_NAME,
    DB_USER,
    DB_PASSWORD
} = process.env

if (!DB_HOST) throw new TypeError('DB_HOST missing!')
if (!DB_PORT) throw new TypeError('DB_PORT missing!')
if (!DB_NAME) throw new TypeError('DB_NAME missing!')
if (!DB_USER) throw new TypeError('DB_USER missing!')
if (!DB_PASSWORD) throw new TypeError('DB_PASSWORD missing!')

let database: Mongoose.Connection

export const connect = (callback: Function) => {
    
    const uri = `mongodb://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}?authSource=admin`

    if (database) {
        return
    }

    Mongoose.connect(uri)

    database = Mongoose.connection

    database.once('open', async () => {
        console.log('Connected to database')

        callback()
    })

    database.on('error', () => {
        console.log('Error connecting to database')
    })

    return {
        UserModel,
        ChatModel,
        MessageModel
    }
}

export const disconnect = () => {

    if (!database) {
        return
    }

    Mongoose.disconnect()
}

当前运行中的容器列表截图:
运行容器列表截图

故障现象:应用容器因数据库连接错误无法启动,MongoDB容器本身运行状态正常。


问题原因与修复方案

核心错误是MongoDB数据卷持久化逻辑导致初始化账号配置未生效:

  • MONGO_INITDB_ROOT_USERNAME、MONGO_INITDB_ROOT_PASSWORD两个环境变量仅在MongoDB数据目录为空、实例首次初始化时才会触发账号创建操作
  • 配置中写了./data:/data/db本地卷挂载,只要之前启动过db容器,./data目录下就会留存旧版本数据(要么是无认证模式下生成的数据,要么是绑定了旧账号密码的数据),后续重启容器时不会重复执行初始化账号逻辑,配置里的root/mypwd账号实际并未创建,认证必然失败。

修复步骤

  • 停止并删除所有关联容器:
docker compose down
  • 清除本地旧MongoDB持久化数据(若有存量重要数据请提前备份,该操作会清空库内所有内容):
rm -rf ./data
  • 重新拉起容器,此时db容器会执行首次初始化流程,按照环境变量配置自动创建管理员账号:
docker compose up -d

可选优化:如果不需要从宿主机直接连接MongoDB,可删除db服务下的ports字段配置,避免数据库端口直接暴露到公网引发安全问题。


内容的提问来源于stack exchange,提问作者sfarzoso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:03:18