Node.js 如何在Nginx Docker映像上使用Traefik PathPrefix?

Node.js 如何在Nginx Docker映像上使用Traefik PathPrefix?,node.js,docker,nginx,traefik,Node.js,Docker,Nginx,Traefik,我正在制作一个React前端应用程序,我的目标是使用Docker映像为最终(npm run build)版本提供服务,该映像包含一个带有源代码和Nginx的多阶段构建。还涉及多个其他停靠服务,Traefik充当负载平衡器/转发器/Traefik的其他功能 现在的问题是:当我构建映像时,只要不涉及Traefik,它就可以正常工作,我只是将应用程序转发到我的docker compose.yml文件中的一个端口,如下所示: version: '2.4' services: ui: por

我正在制作一个React前端应用程序,我的目标是使用Docker映像为最终(
npm run build
)版本提供服务,该映像包含一个带有源代码和Nginx的多阶段构建。还涉及多个其他停靠服务,Traefik充当负载平衡器/转发器/Traefik的其他功能

现在的问题是:当我构建映像时,只要不涉及Traefik,它就可以正常工作,我只是将应用程序转发到我的
docker compose.yml
文件中的一个端口,如下所示:

version: '2.4'

services:
  ui:
    ports:
      - someport:80
通过这样做,我发现应用程序在
http://address:someport
没问题

现在我最终要做的是给应用程序一个PathPrefix,Traefik是一个很好的工具。假设我希望最终从
http://address/app

据我所知,这在
docker compose.yml
文件中很容易使用标签完成,如:

version: '2.4'

services:
  ui:
    ports:
      - 80
    labels:
      - traefik.enable=true
      - traefik.http.routers.myapp.rule=PathPrefix("/app")
      - traefik.http.routers.myapp.entrypoints=web
如果这些标签不足以实现我的目标,请通知我

因此,在启动我的应用程序并导航到
http://address/app
,不渲染任何内容重要!->通过查看控制台,应用程序似乎正在尝试访问
http://address/static/css...
http://address/static/js...
源文件,但找不到它们。这些地址后面没有任何内容,但在它们之间添加
/app
,如
http://address/app/static...
,源文件将像预期的那样找到。如何让我的应用程序执行此操作

这是Traefik问题还是Nginx问题,或者可能与npm有关,我觉得这不太可能

的Dockerfile类似于:

# build env
FROM node:13.12.0-alpine as build
WORKDIR /app
ENV PATH /app/node_modules/.bin:$PATH
COPY package*.json ./
RUN npm ci
COPY . ./
RUN npm run build

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

这也是我们几天前遇到的一个有趣的问题。我将分享我的发现,希望它能为你指明正确的方向

仅使用PathPrefix,应用程序必须完全侦听前缀。 从

由于路径是按原样转发的,因此您的服务将侦听/products

如果您的应用程序不在子路径上侦听,则有一个中间件可以去掉前缀: 然而,有一个警告

如果您的后端服务于资产(例如,图像或Javascript文件),那么它很可能必须返回正确构造的相对URL


除了更改应用程序中的路径之外,我们还没有找到解决方案。但是Maaybe这很有帮助

我认为您缺少的是您需要让React知道它不是托管在根
/
上,而是一个子路径。为了配置不同的路径,从而使React能够正确构建路径以访问CSS和JS等资产,您需要将
包.json中的
“homepage”
键设置为不同的值,例如

“主页”:http://address/app",

您可以在中阅读更多关于该主题的内容。

例如,在Next.js中,我必须使用以下内容创建Next.config.js:

{
  module.exports = {
    basePath: '/nextjs',
}
其中nextjs是traefik中的路径前缀值