Traefik动态YAML配置Docker Compose服务提示服务不存在解决方法
Traefik动态配置文件正确配置whoami服务的方法
问题背景
原本通过Docker Compose标签配置whoami容器的路由规则,现在想把这部分配置迁移到Traefik的动态配置文件(whoami.yml)中,但启动后Traefik日志报错:
{"entryPointName":"mydashboard","level":"error","msg":"the service "whoami@file" does not exist","routerName":"whoami@file","time":"2024-02-03T14:18:20Z"}
原Docker Compose文件:
version: '3' services: traefik: image: traefik:v2.10 ports: - "80:80" - "8080:8080" volumes: - /var/run/docker.sock:/var/run/docker.sock - C:\\Users\\juann\\OneDrive\\Documents\\Development\\TraefikTests:/etc/traefik - C:\\Users\\juann\\OneDrive\\Documents\\Development\\TraefikTests\\logs:/traefik/logs - C:\\Users\\juann\\OneDrive\\Documents\\Development\\TraefikTests\\config:/traefik/config labels: - traefik.enable=true whoami: image: traefik/whoami labels: - "traefik.enable=true" - "traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`)"
用户创建的whoami.yml动态配置文件:
http: routers: whoami: entryPoints: - "mydashboard" service: "whoami" rule: 'Host(`{{ "whoami.docker.localhost" }}`)'
报错原因
动态配置里的路由指定了service: "whoami",但这个服务在文件配置(file provider)中未定义,Traefik默认会把这个服务解析为whoami@file,而实际whoami容器的服务由Docker provider提供,ID为whoami@docker,导致找不到对应服务。
解决方案
方案一:在动态配置中定义对应服务,指向Docker容器
修改whoami.yml,添加services节点,明确配置负载均衡指向whoami容器(同一Docker Compose网络下可直接用容器名访问):
http: routers: whoami: entryPoints: - "mydashboard" # 注意:需确保Traefik静态配置中已定义该入口点,否则会报错 service: "whoami" rule: 'Host(`whoami.docker.localhost`)' services: whoami: loadBalancer: servers: - url: "http://whoami:80" # whoami容器默认暴露80端口,同一网络用容器名即可访问
方案二:直接引用Docker Provider提供的服务
直接在路由配置中指定Docker provider提供的服务ID whoami@docker,无需额外定义服务:
http: routers: whoami: entryPoints: - "mydashboard" service: "whoami@docker" # 明确引用Docker管理的whoami服务 rule: 'Host(`whoami.docker.localhost`)'
额外注意事项
- 开启File Provider:需在Traefik静态配置文件(如
traefik.yml)中开启文件配置监听:
providers: file: directory: /traefik/config # 对应compose中挂载的config目录 watch: true # 自动监听配置文件变化
- 确认入口点存在:静态配置中必须定义
mydashboard入口点,否则需修改为已存在的入口点(比如默认的web,对应80端口):
entryPoints: web: address: ":80" # 如果保留mydashboard,需添加如下配置 mydashboard: address: ":8081" # 注意不要和Traefik dashboard的8080端口冲突
- 清理冗余标签:修改whoami容器的Compose配置,删除原路由规则标签,仅保留启用开关:
whoami: image: traefik/whoami labels: - "traefik.enable=true"
内容的提问来源于stack exchange,提问作者juan noguera
相关产品推荐
相关产品推荐

