运行React App的Docker容器中的Proxying API请求

时间:2019-11-23 00:55:21

标签: reactjs docker proxy

我正在docker容器中运行一个简单的react应用。在开发期间,我使用package.json中的代理密钥来指定我的后端api URL:"proxy": "http://localhost:5000"

我在本地运行npm start时一切正常。但是,当我npm start进入docker容器时,它指向"http://localhost:3000"。我也尝试过手动设置代理,如下面的Dockerfile所示,但是似乎没有任何作用:

FROM node:13-alpine
WORKDIR /app

# install dependencies
COPY package*.json ./
RUN npm install --silent

# copy source code
COPY src/ ./src/
COPY public/ ./public/

RUN npm config set proxy http://localhost:5000  # set manully
CMD ["npm", "start"]

我做错了还是不可能?

3 个答案:

答案 0 :(得分:4)

在docker中运行应用程序时,需要将端口设置为后端服务而不是localhost。例如,检查以下Docker容器及其服务。我们的前端在端口3000中运行,后端在端口5000中运行。因此,将"proxy": "http://backend:5000"

替换为localhost
version: '3'

services:
  backend:
    build: ./backend
    ports:
      - 5000:5000
  frontend:
    build: ./frontend
    ports:
      - 3000:3000
    links:
      - backend
    command: npm start

答案 1 :(得分:1)

"proxy": "http://localhost:5000" 在开发阶段工作得很好,因为 webpack DevServer 自己处理代理。一旦你部署了你的 React 应用程序,它就会停止运行。在尝试让我的容器化 React 应用程序与容器化 API 通信时,我遇到了同样的问题。我使用 Nginx 作为 Web 服务器来为 React 应用程序提供服务。我按照这个 guide 将 Nginx 与 Docker 容器集成。 nginx.conf 最初的样子是这样的:

server {

  listen 80;

  location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
    try_files $uri $uri/ /index.html;
  }

  error_page   500 502 503 504  /50x.html;

  location = /50x.html {
    root   /usr/share/nginx/html;
  }

}

但是在我在这里和那里做了一些调整之后,我想出了这个配置(我将稍微谈谈 api 代表什么):

server {

  listen 80;

  location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
    try_files $uri $uri/ /index.html;
  }

  location /api {
    resolver 127.0.0.11;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://api:8000;
  }

  error_page   500 502 503 504  /50x.html;

  location = /50x.html {
    root   /usr/share/nginx/html;
  }

}

发生了什么变化?我为 API 端点添加了一个根位置,因为它们都有一个公共前缀 /apiproxy_pass 属性允许我们将所有到达 /api 的请求代理到我们的后端,该请求通过端口 8000 公开。api 只是 {{1} 中定义的容器的名称}}。

作为参考,这是我的 React 应用程序的 Dockerfile

docker-compose.yaml

和最重要的文件(docker-compose.yaml):

# build environment
FROM node:15.2.1 as build
WORKDIR /app
COPY ./client ./
RUN yarn
RUN yarn build

# production environment
FROM nginx:stable-alpine
COPY --from=build /app/build /usr/share/nginx/html
COPY --from=build /app/nginx/nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

答案 2 :(得分:0)

您现在正在Docker容器中运行React应用,因此您的“ localhost”不再是您的本地计算机,而是该容器。您需要将其代理到后端的IP。您是否在另一个容器中运行API?