Node.js 如何在Nginx Docker映像上使用Traefik PathPrefix?
我正在制作一个React前端应用程序,我的目标是使用Docker映像为最终(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
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中的路径前缀值