【问题标题】:mongoose failing to connect in docker-compose猫鼬无法在 docker-compose 中连接
【发布时间】:2020-09-16 12:30:30
【问题描述】:

我有一个简单的 docker-compose.yml,如下所示:

services:
  mongodb-service:
    image: mongo:latest
    command: "mongod --bind_ip_all"
  mongodb-seeder:
    image: mongo:latest
      depends_on:
        - mongodb-service
      command: "mongoimport --uri mongodb://mongodb-service:27017/auth --drop --file /tmp/users.json"
  myapp:
    image: myapp:latest
    environment:
      DATABASEURL: mongodb://mongodb-service:27017/auth
    depends_on:
      - mongodb-service

myapp 是一个 nodejs 应用程序,它使用 mongoose 连接到 mongodb 数据库,如下所示:

const databaseURL = process.env.DATABASEURL;
async function connectToMongo() {
    try {
        return await mongoose.connect(databaseURL, {
            useUnifiedTopology: true,
            useNewUrlParser: true,
            useCreateIndex: true,
        });
    }
    catch (error) {
        logger.error('MongoDB connect failure.', error);
    }
}

mongodb-seeder 工作得很好。我可以启动它,它连接到mongodb-service 并毫无问题地运行导入。然而,myapp 启动,尝试连接到mongodb-service 30 秒,然后死机:

ERROR 2020-09-16T12:13:21.427 [MAIN] MongoDB connection error! [Arguments] {
  '0': MongooseError [MongooseTimeoutError]: Server selection timed out after 30000 ms
      ...stacktrace snipped...
      at Function.Module._load (internal/modules/cjs/loader.js:724:14) {
    message: 'Server selection timed out after 30000 ms',
    name: 'MongooseTimeoutError',
    reason: Error: connect ECONNREFUSED 127.0.0.1:27017
        at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1128:14) {
      name: 'MongoNetworkError',
      [Symbol(mongoErrorContextSymbol)]: {}
    },
    [Symbol(mongoErrorContextSymbol)]: {}
  }
}

注意:此日志中的 IP 地址表示它尝试连接到 127.0.0.1不是 mongodb://mongodb-service:27017/auth。无论我为DATABASEURL 输入什么值,它都会继续打印127.0.0.1。任何想法为什么我不能让猫鼬识别我给它的主机名?为什么 mongoose 无法连接到网络明显可见的服务,因为另一个容器 (mongodb-seeder) 可以毫无问题地看到它?

编辑:我使用的是猫鼬 5.8.7

【问题讨论】:

    标签: node.js mongodb docker mongoose docker-compose


    【解决方案1】:

    我能够自己解决这个问题,结果证明这是我的一个非常愚蠢的失误。

    我的应用程序的DockerFile 定义了一个入口点,该入口点执行一个在运行之前导出 DATABASEURL 的脚本。删除该导出允许我的 environment: 设置向下流向 nodejs 应用程序。

    【讨论】:

      猜你喜欢
      • 2018-07-24
      • 2022-12-11
      • 2021-06-16
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      • 2018-06-07
      • 1970-01-01
      相关资源
      最近更新 更多