Докер не принимает прокси-сервер API - PullRequest
0 голосов
/ 15 февраля 2019

я получаю следующую ошибку при выполнении docker-compose.Приложение работает, но не может отправлять / отправлять запросы API.Экспресс-сервер использует порт 5000.

] [HPM] Произошла ошибка при попытке прокси-запроса / api / users / user от localhost: от 3000 до http://localhost:5000/ (ECONNREFUSED) (https://nodejs.org/api/errors.html#errors_common_system_errors)

enter image description here

Несмотря на настройку реактивного прокси, ошибка сохраняется.

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/' }))
}

Dockerfile

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"
  }
}

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Я изменил несколько вещей.

Dockerfile

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

docker-compose.yml

version: "3"
services:
  app:
    build: .
    depends_on:
      - postgres
    ports:
      - "8080:8080"
    environment:
      - PORT=8080
      - NODE_ENV=dev
      - ENV_NAME=local  
  postgres:
    image: postgres:9.6.8-alpine
    expose:
      - 5432
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: user
      POSTGRES_DB: db

setupProxy.js

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

module.exports = function(app) {
  app.use(proxy('/auth/github', { target: 'http://127.0.0.1:8080/' }))
  app.use(proxy('/api/users/auth/github', { target: 'http://127.0.0.1:8080/' }))
  app.use(proxy('/api/users/', { target: 'http://127.0.0.1:8080/', "secure": false }))
  app.use(proxy('/api/posts/', { target: 'http://127.0.0.1:8080/' }))
}
0 голосов
/ 15 февраля 2019

Я думаю, что вам нужно изменить localhost: 5000 на имя вашей службы в docker-compose.yml .В этом случае вам нужно будет настроить любой сервер, на котором вы работаете localhost: 5000 , в файле compose.Помните, что ваши контейнеры работают в Docker Network, поэтому они не могут получить доступ к вашему 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), и вы используете докер для новой службы, которая будет взаимодействовать с этим API (например, пользовательский интерфейс веб-клиента), но по какой-то причине вы не можете или не хотитечтобы настроить API для файла docker-compose.yml , вы можете изменить network_mode и environment HOST.

. При таком подходе вам потребуется отобразить порт в контейнере к неиспользуемому порту на хосте .

Итак, допустим, у вас есть API, работающий на localhost:80, и вы запускаете сервер узлов на докере на порту 3000.Если у вас ничего не работает на 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...