mongodb - Docker-Compose 拒绝从 Express App 到 MongoDB 容器的连接

标签 mongodb express docker docker-compose

当尝试使用 docker-compose 将我的 Express 应用程序连接到 mongo 容器时,连接被拒绝。我可以使用 localhost:27017 和 l/p 设置使用 dbSetup.js 连接到 robo3T 的 db 容器,但是当 Express 尝试连接时出现错误:

{ MongoNetworkError: 首次连接时无法连接到服务器 [mongo:27017] [MongoNetworkError: connect ECONNREFUSED 172.19.0.2:27017]

// mongoose
const options = {
  autoIndex: true, // Don't build indexes
  reconnectTries: Number.MAX_VALUE, // Never stop trying to reconnect
  reconnectInterval: 500, // Reconnect every 500ms
  poolSize: 10, // Maintain up to 10 socket connections
  // If not connected, return errors immediately rather than waiting for reconnect
  bufferMaxEntries: 0
};
console.log(options);
mongoose.connect('mongodb://blogUser:blogUserPassword@mongo/blog', options).then(
  () => { console.log("connected !!!"); },
  err => { console.log(err);  }
);

Docker-Compose

version: '3'

services:
  mongo:
    container_name: mongo
    image: mongo
    environment:
      - MONGO_INITDB_ROOT_USERNAME=${MONGO_INITDB_ROOT_USERNAME}
      - MONGO_INITDB_ROOT_PASSWORD=${MONGO_INITDB_ROOT_PASSWORD}
    volumes:
      - ./dbSetup.js:/docker-entrypoint-initdb.d/dbSetup.js
      - /data/db:/data/db
    ports:
      - "27017:27017"

  blog_api:
    container_name: blog_api
    build: ../blog.com/api
    restart: always
    expose: 
      - 3000
    ports:
      - "3000:3000"
    links:
      - mongo
    depends_on:
      - mongo

最佳答案

如果您可以在 mongo 服务运行后运行该应用,则意味着 mongo 启动并准备好连接所需的时间比您的应用尝试启动时所需的时间更长连接。如果您的应用从未连接过,它可能无法正确重新启动 - 您可能希望它在未连接时退出,然后确保您相应地设置了 Docker 重新启动策略(“始终”) 、“故障时”等)请参阅 docs 。假设 mongo 最终启动,您的应用程序最终将连接。

您还可以考虑使用 healthchecks在这种情况下,您可以看到数据库是否实际上正在连接而不是启动。 depends_on 标志只会检查容器是否已启动,不会检查容器中的应用程序运行是否正常。

关于mongodb - Docker-Compose 拒绝从 Express App 到 MongoDB 容器的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49266905/

相关文章:

python - python Tornado 的 Motor 是否接受与 Mongodb 的 ssl 连接?

node.js - 使用范围保护 API(oauth2orize、passport、express、Nodejs)

docker - asp.net-core 2.0 Docker部署

javascript - 类型错误 : todo is not a function

php - 为 MongoDB 中的对象添加值

javascript - Kraken.js 404 和 500 中间件模板

node.js - 用于在请求对象中保存原始发布数据的中间件不会是 "next"并导致超时

MySQL Docker 镜像 : initialized with env variable of K8S Secret

docker - 无法在 docker 容器中通过 ssh 获取任何内容

sql - 对于大量数据的简单分组查询,哪种数据库最有效?