使用节点通过其他服务来代理外部流量模拟响应



我有一个我想编写集成测试的节点应用程序。为此,我需要能够模拟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 END变量,一切都按预期工作。

您是否尝试在代理容器的名称之前使用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

最新更新