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
相关产品推荐
相关产品推荐

