我有一个我想编写集成测试的节点应用程序。为此,我需要能够模拟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