【问题标题】:Getting "MongooseServerSelectionError: connect ECONNREFUSED 127.0.0.1:27017" in Docker Compose在 Docker Compose 中获取“MongooseServerSelectionError:连接 ECONNREFUSED 127.0.0.1:27017”
【发布时间】:2022-01-17 18:47:43
【问题描述】:

我正在使用 Express 和 MongoDB 做一个 REST API。一切都在本地完美运行。我想使用 Docker Compose 对数据库和后端进行 dockerize。

Mongo Docker 运行良好,但后端无法连接到它。它不断向我抛出这个错误:

/backend/node_modules/mongoose/lib/connection.js:797

  const serverSelectionError = new ServerSelectionError();

                               ^


MongooseServerSelectionError: connect ECONNREFUSED 127.0.0.1:27017

    at NativeConnection.Connection.openUri (/backend/node_modules/mongoose/lib/connection.js:797:32)

    at /backend/node_modules/mongoose/lib/index.js:341:10

    at /backend/node_modules/mongoose/lib/helpers/promiseOrCallback.js:32:5

    at new Promise (<anonymous>)

    at promiseOrCallback (/backend/node_modules/mongoose/lib/helpers/promiseOrCallback.js:31:10)

    at Mongoose._promiseOrCallback (/backend/node_modules/mongoose/lib/index.js:1167:10)

    at Mongoose.connect (/backend/node_modules/mongoose/lib/index.js:340:20)

    at Object.<anonymous> (/backend/index.js:11:3)

    at Module._compile (node:internal/modules/cjs/loader:1097:14)

    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1149:10) {

  reason: TopologyDescription {

    type: 'Unknown',

    servers: Map(1) {

      'localhost:27017' => ServerDescription {

        _hostAddress: HostAddress { isIPv6: false, host: 'localhost', port: 27017 },

        address: 'localhost:27017',

        type: 'Unknown',

        hosts: [],

        passives: [],

        arbiters: [],

        tags: {},

        minWireVersion: 0,

        maxWireVersion: 0,

        roundTripTime: -1,

        lastUpdateTime: 14312460,

        lastWriteDate: 0,

        error: MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017

            at connectionFailureError (/backend/node_modules/mongodb/lib/cmap/connect.js:293:20)

            at Socket.<anonymous> (/backend/node_modules/mongodb/lib/cmap/connect.js:267:22)

            at Object.onceWrapper (node:events:510:26)

            at Socket.emit (node:events:390:28)

            at emitErrorNT (node:internal/streams/destroy:164:8)

            at emitErrorCloseNT (node:internal/streams/destroy:129:3)

            at processTicksAndRejections (node:internal/process/task_queues:83:21)

      }

    },

    stale: false,

    compatible: true,

    heartbeatFrequencyMS: 10000,

    localThresholdMS: 15,

    logicalSessionTimeoutMinutes: undefined

  }

}

我在网上看到问题可能是我不应该连接到本地主机,而是连接到 MongoDB 容器。

我附上文件:

docker-compose.yml

version: '3.8'

services:
    data:
      container_name: data
      image: mongo
      ports:
        - 27017:27017
      volumes:
        - ./data/db:/data/db
    
    backend:
      container_name: backend
      depends_on:
        - data
      build: ./backend
      ports:
        - 5000:5000
      environment:
        - DB_HOST=data
        - DB_NAME=${DB_NAME?:}
        - DB_PORT=${DB_PORT?:}

/后端/Dockerfile

# pull official base image
FROM node:latest

# set working directory
WORKDIR /backend

EXPOSE 5000

ENV PORT=5000
ENV HOST=0.0.0.0

# install backend dependencies
COPY package*.json ./
RUN npm ci --only-production

# add backend
COPY . .

# start backend
CMD npm start

/backend/index.js

const express = require("express")
const mongoose = require("mongoose")
const property = require("./routes/property-router")
const properties = require("./routes/properties-router")
const statistics = require("./routes/statistics-router")
const bodyParser = require("body-parser")
const dbConfig = require("./config/db.config")
require("dotenv").config();
var cors = require("cors")


// Connect to MongoDB database
mongoose
    .connect(dbConfig.url, { useNewUrlParser: true })
    .then(() => {
        const app = express()

        app.use(cors())

        app.use(bodyParser.text({ type: '*/*'}))

        app.use("/api", statistics)
        app.use("/api", properties)
        app.use("/api", property)

        const PORT = dbConfig.port || 5000;

        app.listen(PORT, () => {
            console.log(`Server is running on port ${PORT}.`);
        });
    })

/backend/config/db.config.js

require('dotenv').config();

const {
    DB_HOST,
    DB_PORT,
    DB_NAME,
    PORT,
  } = process.env;
  
  module.exports = {
    url: `mongodb://${DB_HOST}:${DB_PORT}/${DB_NAME}`,
    port: PORT
  };

/backend/.env

PORT=5000
HOST=localhost

DB_HOST=localhost
DB_NAME=propertyDB
DB_PORT=27017

在本地运行后端我可以毫无问题地连接到 MongoDB Docker。通过只保留 Docker Compose 文件中的数据并运行节点 index.js。

我做错了什么?

编辑

我什至将 URL 从 index.js 更改为随机 URL,但仍然出现相同的错误并尝试连接到 127.0.0.1:27017。

.connect("randomurl.com", { useNewUrlParser: true })

【问题讨论】:

  • 我已经在这篇文章中恢复了一个已删除的文件,因为它出现在下面的答案中。如果您现在已删除该文件,请将其放入更新部分。在 Stack Overflow 上,问题和答案是为后代保留的,并且它们必须是新的时候没有读过它的读者可以理解的。

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


【解决方案1】:

Docker 容器的行为类似于网络中的节点。除非您告诉它不要这样做,否则 Docker Compose 会创建一个虚拟网络,并在该网络内分配与 docker-compose.yml 文件中的服务名称相对应的 DNS 名称。 .env 中的值会覆盖docker-compose.yml 中的环境变量。

您可以删除(即不复制).env 文件并通过将.env 添加到.dockerignore 来使用环境变量设置值。

或者,您可以更改

DB_HOST=localhost

DB_HOST=data

.env.env 文件应包含

PORT=5000
HOST=localhost

DB_HOST=data
DB_NAME=propertyDB
DB_PORT=27017

【讨论】:

  • 我已经试过了,还是不行。但我明白你的意思。仍然告诉我正在尝试连接到 127.0.0.1:27017 和完全相同的错误。
  • 他在 docker-compose 上用environment: - DB_HOST=data覆盖它
  • @TheFool require('dotenv').config(); 读取.env 文件并覆盖process.env 的值
  • 你重建镜像了吗?我建议在 .dockerignore 中列出 .env 文件,然后确保重建映像。
  • @DavidVives 我已经从您的问题中复制了所有代码,删除了路线(因为您没有提供文件),并将您的 .env 替换为我的。服务器工作并连接到数据库。
【解决方案2】:

问题在于,当您运行 docker compose 时,会创建并存储一个新图像。所以每次你运行同一个容器时,都会执行同一个镜像。 你需要做的是:

第一步,您应该首先关闭所有正在运行的 docker-compose 配置:

$ docker-compose down

您可以使用以下命令来验证没有任何东西在运行:

$ docker ps --all

要移除本地构建的镜像,首先列出本地缓存的所有镜像,然后移除本地构建的所有镜像:

$ docker images

然后删除给您带来问题的图像。

$ docker rmi <image_name>

这解决了问题。

【讨论】:

  • 有几种方法可以解决这个问题。正如愚人所说,重建就可以了。此外,在开发环境中,提供实时代码视图的主机上的卷很有帮助(这减少了开发环境中所需的重建次数)。
  • 这不是真的,我们执行了 --force-rebuild 并没有删除图像
猜你喜欢
  • 2021-04-15
  • 2021-12-18
  • 2021-09-01
  • 1970-01-01
  • 2018-03-13
  • 2022-12-30
  • 2020-04-10
  • 2022-11-09
  • 1970-01-01
相关资源
最近更新 更多