简体   繁体   English

mongoose 无法连接到 docker 中的 mongodb

[英]mongoose couldn't connect to mongodb in docker

mongoose couldn't authenticate with docker mongodb container. mongoose 无法使用 docker mongodb 容器进行身份验证。 Note : mongo is in docker and my API app out of the docker.注意:mongo 在 docker 中,我的 API 应用程序在 docker 之外。

docker-compose: docker-compose:

version: "3.7"

services:
  db:
    image: mongo:latest
    environment:
      MONGO_INITDB_ROOT_USERNAME: "${MONGO_USERNAME}"
      MONGO_INITDB_ROOT_PASSWORD: "${MONGO_PASSWORD}"
      MONGO_INITDB_DB: "${MONGO_DB}"
    ports:
      - 27017:27017
    volumes:
      - mongo_data:/data/db

volumes:
  mongo_data:

.env: .env:

MONGO_USERNAME=root
MONGO_PASSWORD=123456
MONGO_DB=nodeApp

db.js (database connection file): db.js(数据库连接文件):

(async () => {
  try {
    const uri = `mongodb://127.0.0.1:27017/${process.env.MONGO_DB}`;
    await mongoose.connect(uri, {
      useNewUrlParser: true,
      useUnifiedTopology: true,
      useFindAndModify: false,
      useCreateIndex: true,
      user: process.env.MONGO_USERNAME,
      pass: process.env.MONGO_PASSWORD,
    });
    console.log("Database connection completed successfully");
  } catch (error) {
    console.error(error);
  }
})();

and finally this is what I got from console:最后这是我从控制台得到的: 在此处输入图像描述

I can connect to mongo with mongoose with username and password.我可以使用用户名和密码使用 mongoose 连接到 mongo。

Docker only supports using default environment variables to be used like what you did in your code. Docker 仅支持使用默认环境变量,就像您在代码中所做的那样。

https://docs.docker.com/compose/env-file/ https://docs.docker.com/compose/env-file/

Docker added support to env filed since version 1.3 (as I remember). Docker 自 1.3 版起添加了对 env 文件的支持(我记得)。 The soloution is to use env_file key in your yml file.解决方案是在 yml 文件中使用env_file键。

  services:
    db:
        image: mongo:latest
        environment:
            MONGO_INITDB_ROOT_USERNAME: "${MONGO_USERNAME}"
            MONGO_INITDB_ROOT_PASSWORD: "${MONGO_PASSWORD}"
            MONGO_INITDB_DB: "${MONGO_DB}"
        ports:
            - 27017:27017
        volumes:
            - mongo_data:/data/db
        env_file:
            - mongo_variables.env

Instead of localhost use your ip on database configuration.而不是 localhost 在数据库配置上使用您的 ip 。

Replace this DBurl=mongodb://localhost:27017/替换这个DBurl=mongodb://localhost:27017/

to this one DBurl=mongodb://XXXX:27017/ ( XXXX means your ip address )on your database configuration file.到数据库配置文件中的这个DBurl=mongodb://XXXX:27017/ (XXXX 表示您的 ip 地址)。

On your docker-compose.yml file在您的 docker-compose.yml 文件上

  • Inside of services of api add CONNECTIONSTRING.在 api 的服务内部添加 CONNECTIONSTRING。
version: "3.7"

services:
 api:
    build: node-server                                ## as i am using node       
    ports:
      - 3000:3000
    environment:
      - CONNECTIONSTRING=mongodb://X.X.X.X:27017/     ##X.X.X.X means your ip address
    
  db:
    image: mongo:latest
    environment:
      MONGO_INITDB_ROOT_USERNAME: "${MONGO_USERNAME}"
      MONGO_INITDB_ROOT_PASSWORD: "${MONGO_PASSWORD}"
      MONGO_INITDB_DB: "${MONGO_DB}"
    ports:
      - 27017:27017
    volumes:
      - mongo_data:/data/db

volumes:
  mongo_data:

you see that in the inspector docker -> port of your container -> (0.0.0.0:27017)您在检查员 docker -> 容器端口 -> (0.0.0.0:27017) 中看到

mongodb://0.0.0.0:27017/

;) ;)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM