Traefik v2部署Docker Compose服务时/flask路径404错误求助
解决Traefik转发Flask服务出现404的问题
问题描述
使用以下Docker Compose配置时,Traefik仪表盘和whoami服务均可正常访问,但访问http://localhost/flask时出现404错误:
version: "3" networks: vester-net: name: vester-net services: traefik: image: traefik:v2.10 volumes: - /var/run/docker.sock:/var/run/docker.sock:ro networks: - vester-net command: --api.insecure=true --providers.docker --accessLog ports: - 80:80 - 8080:8080 labels: - traefik.enable=true whoami: image: traefik/whoami:v1.8 networks: - vester-net labels: - traefik.http.routers.mywhoami.rule=(Host(`localhost`) && PathPrefix(`/whoami`)) simplified_flask: build: context: ./apps/score networks: - vester-net labels: - traefik.http.routers.myflask.rule=(Host(`localhost`) && PathPrefix(`/flask`))
解决方案
1. 修改Docker Compose配置,添加路径剥离中间件
Traefik会将完整的/flask路径转发给Flask服务,但如果Flask应用没有/flask对应的路由,就会返回404。需要添加中间件剥离前缀,将请求转发到Flask的根路径:
version: "3" networks: vester-net: name: vester-net services: traefik: image: traefik:v2.10 volumes: - /var/run/docker.sock:/var/run/docker.sock:ro networks: - vester-net command: --api.insecure=true --providers.docker --accessLog ports: - 80:80 - 8080:8080 labels: - traefik.enable=true whoami: image: traefik/whoami:v1.8 networks: - vester-net labels: - traefik.http.routers.mywhoami.rule=(Host(`localhost`) && PathPrefix(`/whoami`)) simplified_flask: build: context: ./apps/score networks: - vester-net labels: - traefik.http.routers.myflask.rule=(Host(`localhost`) && PathPrefix(`/flask`)) # 添加路径剥离中间件 - traefik.http.middlewares.flask-stripprefix.stripprefix.prefixes=/flask # 路由引用该中间件 - traefik.http.routers.myflask.middlewares=flask-stripprefix@docker # 可选:如果Flask服务端口不是默认5000,指定端口 # - traefik.http.services.myflask.loadbalancer.server.port=5000
2. 确认Flask应用的路由配置
确保你的Flask应用中有根路径的路由,比如:
from flask import Flask app = Flask(__name__) @app.route('/') def home(): return "Hello from Flask!" if __name__ == '__main__': app.run(host='0.0.0.0')
3. 验证服务状态
- 重新启动服务:
docker-compose up -d --build - 查看Flask服务日志确认是否正常启动:
docker-compose logs simplified_flask - 检查Traefik仪表盘(
http://localhost:8080),确认simplified_flask服务已被正确识别并关联到路由
内容的提问来源于stack exchange,提问作者Amon Bazongo
相关产品推荐
相关产品推荐

