NestJs连接Docker容器内MongoDB数据库失败问题排查
NestJs本地连接Docker中MongoDB的认证问题
问题现象
- 使用带指定库的认证URI
DATABASE_URI=mongodb://root:toor@localhost:27017/library时,连接失败,日志提示认证错误; - 使用不带指定库的URI
DATABASE_URI=mongodb://root:toor@localhost:27017可连接,但Schema自动创建在test库,不符合需求; - 尝试将URI中的
localhost替换为Docker服务名mongodb,仍无法连接; - 使用无认证信息的URI
DATABASE_URI=mongodb://localhost:27017/library可连接,但执行查询时提示需认证。
附Docker Compose配置
version: '3' services: mongodb: image: mongo container_name: mongo-library environment: - MONGO_INITDB_ROOT_USERNAME=root - MONGO_INITDB_ROOT_PASSWORD=password - MONGO_INITDB_DATABASE=library ports: - '27017:27017' volumes: - ./data/db:/app/data/db networks: - app-network restart: always mongo-express: image: mongo-express container_name: mongo-express-library environment: - ME_CONFIG_MONGODB_SERVER=mongodb - ME_CONFIG_MONGODB_ENABLE_ADMIN=true - ME_CONFIG_MONGODB_ADMINUSERNAME=root - ME_CONFIG_MONGODB_ADMINPASSWORD=password - ME_CONFIG_BASICAUTH_USERNAME=root - ME_CONFIG_BASICAUTH_PASSWORD=password - ME_CONFIG_MONGODB_PORT=27017 ports: - '8081:8081' depends_on: - mongodb networks: - app-network restart: always networks: app-network: driver: bridge
相关错误日志
- 使用带指定库的认证URI时:
[Nest] 1504 - 10/30/2023, 23:09:26 ERROR [MongooseModule] Unable to connect to the database. Retrying (1)... [Nest] 1504 - 10/30/2023, 23:09:50 ERROR [ExceptionHandler] Authentication failed.
- 使用无认证信息的URI时:
[Nest] 20624 - 10/30/2023, 23:22:28 ERROR [ExceptionsHandler] Command find requires authentication MongoServerError: Command find requires authentication
解决方法
1. 修正认证密码与认证源
你的Docker Compose中MongoDB根密码是password,但连接URI里误用了toor,同时需要指定认证源为admin(根用户默认在admin库下认证)。正确的连接URI应为:
DATABASE_URI=mongodb://root:password@localhost:27017/library?authSource=admin
2. 关于Docker服务名无法连接的说明
本地运行的NestJs不在Docker容器网络内,因此不能直接使用Docker服务名mongodb连接,必须用localhost或宿主机IP(端口已映射到宿主机27017)。只有Docker容器之间才能通过服务名互相访问。
3. 验证连接
修改URI后重启NestJs服务,即可正常连接library库,Schema会创建在指定库中,同时认证通过可执行查询操作。
可选:创建专用库用户(推荐)
若不想使用根用户连接业务库,可添加初始化脚本创建library库的专用用户:
- 创建
./mongo-init.js文件:
db.createUser({ user: 'library_user', pwd: 'library_pass', roles: [{ role: 'dbOwner', db: 'library' }] });
- 在Docker Compose的
mongodb服务中挂载初始化脚本:
volumes: - ./data/db:/app/data/db - ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js
- 重启MongoDB容器后,使用新用户的URI连接:
DATABASE_URI=mongodb://library_user:library_pass@localhost:27017/library
内容的提问来源于stack exchange,提问作者Hamada
相关产品推荐
相关产品推荐

