webpack-dev-server proxy to docker container

2019-04-07 20:00发布

I have 2 docker containers managed with docker-compose and can't seem to properly use webpack to proxy some request to the backend api.

docker-compose.yml :

version: '2'

services:
  web:
    build:
      context: ./frontend
    ports:
      - "80:8080"
    volumes:
      - ./frontend:/16AGR/frontend:rw
    links:
      - back:back
  back:
    build:
      context: ./backend
    expose:
      - "8080"
    ports:
      - "8081:8080"
    volumes:
      - ./backend:/16AGR/backend:rw

the service web is a simple react application served by a webpack-dev-server. the service back is a node application.

I have no problem to access either app from my host :

$ curl localhost
> index.html
$ curl localhost:8081
> Hello World

I can also ping and curl the back service from the web container :

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
73ebfef9b250        16agr_web           "npm run start"     37 hours ago        Up 13 seconds       0.0.0.0:80->8080/tcp     16agr_web_1
a421fc24f8d9        16agr_back          "npm start"         37 hours ago        Up 15 seconds       0.0.0.0:8081->8080/tcp   16agr_back_1

$ docker exec -it 73e bash
$ root@73ebfef9b250:/16AGR/frontend# curl back:8080
Hello world

However i have a problem with the proxy. Webpack is started with

webpack-dev-server  --display-reasons --display-error-details --history-api-fallback --progress --colors -d --hot --inline --host=0.0.0.0 --port 8080

and the config file is

frontend/webpack.config.js :

var webpack = require('webpack');
var config = module.exports = {
  ...
  devServer: {
    //redirect api calls to backend server
    proxy: {
      '/api': {
        target: "back:8080",
        secure: false
      }
    }
  }
  ...
}

When i try to request /api/test with a link in my app for exemple i get a generic error, the link and google did not help much :(

[HPM] Error occurred while trying to proxy request /api/test from localhost to back:8080 (EINVAL) (https://nodejs.org/api/errors.html#errors_common_system_errors)

I suspect some weird thing because the proxy is on the container and the request is on localhost but I don't really have an idea to solve this.

1条回答
我欲成王,谁敢阻挡
2楼-- · 2019-04-07 20:42

I think I managed to tacle the problem. Just had to change the webpack configuration with the following

  devServer: {
    //redirect api calls to backend server
    proxy: {
      '/api': {
        target: {
          host: "back",
          protocol: 'http:',
          port: 8080
        },
        ignorePath: true,
        changeOrigin: true,
        secure: false
      }
    }
  }
查看更多
登录 后发表回答