Docker部署Mongo实例认证失败问题求助
解决Docker中Mongoose连接Mongo认证失败的问题
我来帮你梳理下这个认证失败的问题,看了你的配置和连接代码,有几个关键细节需要调整:
1. 修正数据库主机名
你的Docker Compose配置里,Mongo服务的名称是mongo-server,但应用的连接字符串里用的是mongo作为主机地址——Docker容器间是通过服务名来通信的,这会导致应用找不到Mongo实例。把连接字符串里的主机名改成mongo-server,和Compose里的服务名保持一致。
2. 指定认证源(authSource)
你创建的是Mongo的root管理员用户,这个用户是存储在admin系统数据库里的。默认情况下Mongoose不会自动指定认证的数据库,所以必须在连接字符串末尾加上?authSource=admin参数,告诉Mongo要到admin库去验证这个root用户的身份。
3. 给应用容器传递环境变量
你的app服务在Docker Compose里没有配置传递MONGO_ROOT_USER和MONGO_ROOT_PASSWORD这两个环境变量,导致应用代码里的process.env拿不到这两个值,自然会认证失败。需要在app的environment部分新增这两个变量:
app: container_name: app image: "node:12" working_dir: /home/node/app environment: - NODE_ENV=production - MONGO_ROOT_USER=${MONGO_ROOT_USER} # 新增:传递root用户名 - MONGO_ROOT_PASSWORD=${MONGO_ROOT_PASSWORD} # 新增:传递root密码 volumes: - ./:/home/node/app ports: - "8888:8888" command: "npm run start" depends_on: - mongo-server
4. 最终正确的连接字符串
调整后,你的Mongoose连接字符串应该是这样的:
`mongodb://${process.env.MONGO_ROOT_USER}:${process.env.MONGO_ROOT_PASSWORD}@mongo-server:27017/app?authSource=admin`
额外提示
depends_on只是保证容器的启动顺序,不会等待Mongo服务完全就绪(比如初始化完成、可以接受连接)。如果应用启动时Mongo还没准备好,可能会出现短暂的连接失败。你可以在应用代码里添加Mongoose的重连逻辑,或者使用wait-for-it这类工具,让应用等待Mongo服务就绪后再启动。
内容的提问来源于stack exchange,提问作者Josh Bowden
相关产品推荐
相关产品推荐

