Traefik v2 Docker路径路由前缀剥离全局配置问题求助
解决方案
错误原因说明
你之前的启动参数报错是因为Traefik Docker Provider没有providers.docker.middleware这个配置项,无法直接在Docker Provider参数中定义中间件,所有中间件需要先在动态配置中定义,再通过全局默认中间件参数引用。
配置修改步骤
1. 新增动态配置文件
你已经在启动参数中配置了--providers.file.directory=/etc/traefik/dynamic,我们直接用这个目录加载通用中间件配置。
先在本地创建动态配置目录./traefik/dynamic,在目录下新建default-middlewares.yaml文件,内容如下:
http: middlewares: strip-service-prefix: stripPrefixRegex: regex: - "^/[^/]+"
这个中间件会自动剥离请求路径的第一层前缀,刚好匹配你/app1、/app2的场景。
2. 修改docker-compose.yml配置
需要做两处调整:
- 挂载本地动态配置目录到Traefik容器对应路径
- 新增Docker Provider默认中间件参数,引用上面定义的前缀剥离中间件
修改后的完整配置如下:
version: "3" services: traefik: image: "traefik:v2.5.4" command: - --entrypoints.web.address=:80 - --providers.docker=true - --api - --api.insecure=true - --api.dashboard=true - --providers.file.directory=/etc/traefik/dynamic - --providers.docker.defaultRule=Host(`app.mydomain.com`) && PathPrefix(`/{{ index .Labels "com.docker.compose.service" }}`) # 新增:全局默认中间件,引用file provider定义的前缀剥离中间件 - --providers.docker.defaultMiddlewares=strip-service-prefix@file ports: - "80:80" - "8080:8080" volumes: - "/var/run/docker.sock:/var/run/docker.sock:ro" # 新增:挂载本地动态配置目录 - "./traefik/dynamic:/etc/traefik/dynamic:ro" app1: image: containous/whoami:v1.3.0 app2: image: containous/whoami:v1.3.0 app3: image: containous/whoami:v1.3.0
验证效果
启动服务后执行curl http://app.mydomain.com/app2/foo,查看whoami返回的Path字段值为/foo即配置生效。
官方文档查询方法
- 找Docker Provider配置项:查看Docker Provider文档的Configuration章节,可以找到
defaultMiddlewares参数,作用是为所有Docker自动发现的路由默认绑定指定中间件,无需逐个容器配置label。 - 找中间件配置:查看HTTP Middlewares章节,找到StripPrefixRegex中间件的定义规则和正则写法。
- 找中间件引用规则:查看中间件文档的命名空间章节,不同Provider提供的中间件需要加对应后缀,文件Provider提供的中间件后缀为
@file。
内容的提问来源于stack exchange,提问作者Paul Sweeney
相关产品推荐
相关产品推荐

