Использование узла для прокси внешнего трафика из контейнера через другой сервис макет ответа - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть приложение для узла, для которого я хочу написать интеграционные тесты.Чтобы это работало, мне нужно иметь возможность имитировать запросы как для http-запросов, так и для websocket.Я использую docker-compose для определения зависимостей моего приложения.Соответствующая часть моего docker-compose.yml:

version: "3.2"
services:
  app:
    build: .
    command: npm run dev
    depends_on:
      - proxycontainer
    environment:
      HTTP_PROXY: proxycontainer:8080
      NO_PROXY: localhost,127.0.0.1
  proxycontainer:
    build: ./proxy

У меня есть простое Dockerfile для приложения узла

FROM node:8.12.0-alpine as base

WORKDIR /usr/app

COPY package*.json ./

RUN apk add --no-cache --virtual .gyp \
        python \
        make \
        g++ \
    && npm install \
    && apk del .gyp

FROM base as build

COPY . .

RUN npm run build

Прокси Dockerfile выглядит как

FROM node:8.12.0-alpine

WORKDIR /usr/app

COPY package*.json ./

RUN npm install

COPY . .

CMD [ "npm", "run", "proxy" ]

Где npm run proxy запускает node ./index.js для этого простого файла

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

const app = express()

app.use('/', proxy({ target: 'http://www.example.org', changeOrigin: true, logLevel: 'debug' }))

app.listen(8080)

Чтобы протестировать только прокси, я заменил мое приложение на

const testProxy = async () => {
  const data = await axios.get("http://example.org/");
  console.log(data.data)
}

testProxy()

При запуске этого примерая получаю сообщение об ошибке Error: connect EINVAL 0.0.31.144:80 - Local (0.0.0.0:0)

Итак, как я могу прокси-сервер внешних запросов от одной службы Docker узла в службу прокси узла, которая затем может смоделировать ответ для соединений http и websocket?

Еслия удаляю переменную HTTP_PROXY env все работает как положено.

1 Ответ

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

Вы пытались использовать префикс http:// перед именем вашего прокси-контейнера?

HTTP_PROXY: http://proxycontainer:8080

Вы также можете создать собственную сеть и назначить локальный IP-адрес каждому контейнеру, чтобы вы могли получить к ним доступ, используястатический IP.

version: "3.2"
services:
  app:
    build: .
    command: npm run dev
    depends_on:
      - proxycontainer
    environment:
      HTTP_PROXY: http://172.28.1.2:8080/
      NO_PROXY: localhost,127.0.0.1
    networks:
      proxy_net:
        ipv4_address: 172.28.1.1
  proxycontainer:
    build: ./proxy
    networks:
      proxy_net:
        ipv4_address: 172.28.1.2

networks:
  proxy_net:
    ipam:
      driver: default
      config:
        - subnet: 172.28.0.0/16
...