Quasar 和 webpack devServer ECONNREFUSED on docker compose

Quasar and webpack devServer ECONNREFUSED on docker compose

我正在尝试通过 docker-compose 开发应用程序。此应用程序包含三个组件:一个前端(使用 Quasar 框架构建)和一个后端(使用 python/flask 构建),以及另一个 API(此处不相关)。问题是:当我在我的项目目录中执行 docker-compose up 时,前端运行完美(我可以通过浏览器访问它),但是当我向后端发出请求时(通过单击某个按钮前面)我在终端中遇到以下错误:

[HPM] Error occurred while trying to proxy request /api/projects from 0.0.0.0:8080 to https://backend:5000 (ECONNREFUSED) (https://nodejs.org/api/errors.html#errors_common_system_errors)

我收到了一个 504 状态码。

这是我的 docker-compose.yml 文件:

version: "3"
services:
  backend:
    build:
      dockerfile: Dockerfile.dev
      context: "./backend"
    volumes:
      - "./backend/venv"
      - "./backend:/usr/app"
    environment:
      - FLASK_ENV=dev
    ports:
      - "5000:5000"
  frontend:
    build:
      dockerfile: Dockerfile.dev
      context: "./frontend"
    volumes:
      - "./frontend/node_modules"
      - "./frontend:/usr/app"
    ports:
      - "8080:8080"
  api:
    build:
      dockerfile: Dockerfile.dev
      context: "./api"
    volumes:
      - "./api:/usr/app"
    expose:
      - "3000"

这是我的 quasar.conf.js 文件中的 devServer 对象:

    devServer: {
      https: true,
      // open: true, // opens browser window automatically
      proxy: {
        "/api": {
          target: source,
          ws: true,
          changeOrigin: false,
          secure: false,
        },
        "/login": {
          target: source,
          ws: true,
          changeOrigin: false,
          secure: false,
        },
        "/logout": {
          target: source,
          ws: true,
          changeOrigin: false,
          secure: false,
        },
        "/media": {
          target: source,
          ws: true,
          changeOrigin: false,
          secure: false,
        },
      },
    },

此外,source定义为const source = "https://backend:5000"

那么,为什么会出现此错误,我该如何解决?提前致谢!

Quasar 内嵌了 webpack DevServer,默认只监听 localhost 接口。但是,在 Docker 上下文中,每个容器都有自己的 localhost,如果某物仅侦听 localhost,则无法从其自己的容器外部访问它。

在您的 Quasar 配置中,您需要将 host 属性 更改为特殊的 0.0.0.0“无处不在”地址:

devServer: {
  host: '0.0.0.0', // <-- add this
  https: true,
  ...
}

如果您在 Docker 文件中进行此更改,可能是通过 COPY 面向生产的配置文件代替正常配置,请不要忘记删除 volumes: 块在 docker-compose.yml 中隐藏所有 Docker 文件的工作。