Traefik v2.5跳转Portainer容器失败返回404问题求助
问题根源
出现404的核心原因有两个:
- 路径转发不匹配:Traefik匹配到
/portainer路径后,直接将完整路径/portainer转发给Portainer服务,但Portainer默认只响应根路径/的请求,收到/portainer路径请求时无对应路由,返回404 - docker-compose配置存在语法错误:portainer的volumes配置里
- portainer_data:/data"末尾多了一个多余的双引号,虽然该错误不一定直接导致404,但存在配置加载隐患
解决方案
提供两种可选方案,按需选择即可:
方案1:添加Traefik StripPrefix中间件(推荐,无需修改Portainer配置)
修改docker-compose.yml中portainer的labels配置,新增StripPrefix中间件,把路径中的/portainer前缀去掉后再转发给Portainer,同时修正配置语法错误:
portainer: image: "portainer/portainer-ce" container_name: "portainer" networks: - traefik_net volumes: - "/var/run/docker.sock:/var/run/docker.sock" - portainer_data:/data # 修正多余的双引号 labels: - "traefik.enable=true" - "traefik.http.routers.portainer.entrypoints=web" - "traefik.http.routers.portainer.rule=Host(`localhost`) && PathPrefix(`/portainer`)" # 新增中间件配置:去掉路径第一层前缀/portainer - "traefik.http.middlewares.portainer-stripprefix.stripprefix.prefixes=/portainer" # 给当前路由绑定中间件 - "traefik.http.routers.portainer.middlewares=portainer-stripprefix" - "traefik.http.services.portainer.loadbalancer.server.port=9000"
方案2:修改Portainer基础路径(适合需要保留路径前缀的场景)
给Portainer容器添加启动参数,直接指定它的服务基础路径为/portainer,无需新增Traefik中间件:
portainer: image: "portainer/portainer-ce" container_name: "portainer" command: "--base-url=/portainer" # 新增启动参数指定基础路径 networks: - traefik_net volumes: - "/var/run/docker.sock:/var/run/docker.sock" - portainer_data:/data # 修正多余的双引号 labels: - "traefik.enable=true" - "traefik.http.routers.portainer.entrypoints=web" - "traefik.http.routers.portainer.rule=Host(`localhost`) && PathPrefix(`/portainer`)" - "traefik.http.services.portainer.loadbalancer.server.port=9000"
生效验证
修改完成后执行docker-compose up -d重启服务,等待10秒后再访问http://localhost/portainer即可正常打开Portainer门户。
内容的提问来源于stack exchange,提问作者elo2017
相关产品推荐
相关产品推荐

