javascript - Docker 不接受代理 api 服务器

标签 javascript reactjs docker express

我在执行 docker-compose up 时收到以下错误。该应用程序正在运行但无法发出任何 api post/get 请求。 Express 服务器正在使用端口 5000。

] [HPM] Error occurred while trying to proxy request /api/users/user from localhost:3000 to http://localhost:5000/ (ECONNREFUSED) (https://nodejs.org/api/errors.html#errors_common_system_errors)

enter image description here

尽管设置了 react 代理,错误仍然存​​在。

setupProxy.js

const proxy = require('http-proxy-middleware');

module.exports = function(app) {
//   app.use(proxy('/auth/github', { target: 'http://localhost:3000/' }))
  app.use(proxy('/api/users/auth/github', { target: 'http://localhost:5000/' }))
  app.use(proxy('/api/users/', { target: 'http://localhost:5000/' }))
  app.use(proxy('/api/posts/', { target: 'http://localhost:5000/' }))
}

Docker 文件

FROM node:8.10.0-alpine
EXPOSE 3000
COPY . /home/app
WORKDIR /home/app
RUN npm install
CMD ["npm", "start"]

docker-compose.yml

# docker-compose.yml
version: "3"
services:
  app:
    build: .
    depends_on:
      - postgres
    ports:
      - "3000:3000"
      - "9229:9229"
  postgres:
    image: postgres:9.6.8-alpine
    expose:
      - 5432
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: user
      POSTGRES_DB: db

enter image description here

package.json

{
  "name": "sequelize-demo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "client": "cd ./client && npm start",
    "server": "nodemon app.js  --ignore client",
    "build": "echo 'hello build'",
    "start": "concurrently --kill-others   \"npm run server\" \"npm run client\""
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "async": "^2.6.1",
    "bcrypt": "^3.0.3",
    "body-parser": "^1.18.3",
    "concurrently": "^4.1.0",
    "cookie-parser": "^1.4.3",
    "cookie-session": "^2.0.0-beta.3",
    "cors": "^2.8.5",
    "crypto": "^1.0.1",
    "dotenv": "^6.2.0",
    "express": "^4.16.4",
    "express-flash": "0.0.2",
    "express-session": "^1.15.6",
    "jsonwebtoken": "^8.4.0",
    "morgan": "^1.9.1",
    "nodemailer": "^5.1.1",
    "nodemon": "^1.18.9",
    "passport": "^0.4.0",
    "passport-github": "^1.1.0",
    "passport-github2": "^0.1.11",
    "passport-jwt": "^4.0.0",
    "passport-local": "^1.0.0",
    "pg": "^7.8.0",
    "pg-hstore": "^2.3.2",
    "sequelize": "^4.42.0"
  }
}

最佳答案

我认为您需要将 localhost:5000 更改为您在 docker-compose.yml 中的服务名称。在这种情况下,您需要在撰写文件中设置在 localhost:5000 上运行的任何服务器。请记住,您的容器在 Docker 网络中运行,因此它们无法在主机上访问您的 localhost

在此示例中,您可以看到我需要将 PMA_HOST 环境变量设置为 db 服务,而不是“普通主机”。在数据库配置中,在我的源代码中,我还将主机设置为相同的 db 服务,一切都运行良好。

版本:'3'

services:
  app:
    build: .
    ports:
      - 80:80
    depends_on:
      - db
  db:
    image: mariadb:10.0
    volumes:
      - db:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: 123
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    ports:
      - 8080:80
    environment:
      PMA_HOST: db
    depends_on:
      - db
volumes:
  db:

这是必需的,因为每次运行新容器时,它都会获得不同的 IP 到新的 Docker 网络中。在这种情况下,我们总是需要检查这个新 IP 并将其设置在我们的代码中。 Docker 通过让我们将新主机附加到一个简单且不可变的名称来解决这个问题,该名称在 compose 中就是服务的名称。

更新:network_mode 方法

如果您已经在本地主机上运行了一项服务(例如:API 服务器),并且您正在使用 docker 进行将与该 API 交互的新服务(例如:网络客户端 UI),但是由于某种原因,您不能或不想在 docker-compose.yml 文件上设置 API,您可以更改 network_modeenvironment HOST.

在这种方法中,您必须将容器上的端口映射到主机上未使用的端口

所以,假设您有一个在 localhost:80 上运行的 API,并且您在端口 3000 上的 docker 上运行一个节点服务器。如果您没有在 localhost 上运行任何东西:3000,您可以执行以下操作:

spa:
   user: ${COMPOSE_UID}:${COMPOSE_GID}
   image: node:10-slim
   working_dir: /home/node/app
   environment:
      - HOST=0.0.0.0
   ports:
      - 3000:3000
   volumes:
      - ./:/home/node/app
   command: bash -c 'yarn install && yarn run dev'
   network_mode: "host"

关于javascript - Docker 不接受代理 api 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54700614/

相关文章:

javascript - 使用 jQuery 拖动后从模板中获取信息

javascript - React Redux 无法读取未定义的属性 'dispatch'

javascript - react : Access element's text

reactjs - React Redux - 如果尚未获得数组,如何加载详细信息?

django - 为什么我无法通过 'docker-compose run web' 命令运行 django 迁移?

javascript - Lodash js 检查值是否与 null 不同

javascript - 分配并立即删除属性

javascript - 在 DOM 中插入文件输入作为 img

amazon-web-services - 无法增加EC2中的docker卷大小

node.js - Next.js 服务器端 api 调用返回 500 内部服务器错误