Traefik 2.0和Docker设置中间件,无需命名路由器

Rob*_*cco 6 docker docker-swarm traefik

我正在将 traefik 2.0 与 docker 提供程序(群模式)一起使用,并且我希望为在 traefik 上发布自身的服务提供默认方式,以避免冲突。

我设法创建了一个满足我的需求的默认规则,但我现在很挣扎,因为我没有找到一种方法来提供默认中间件来去除前缀。

有没有一种方法可以添加 docker 服务标签,而无需提供特定的路由器名称,但仍然向 traefik 隐式创建的任何路由器添加中间件?或者有没有办法像默认规则一样定义默认中间件?

我试图实现的解决方案是删除以下标签中的所有变量替换,从而减少整个定义的冗长性,但又不会让自己陷入命名冲突:

        - traefik.enable=true
        - traefik.http.services.${ENV:-dev}_${STACK}_whoami.loadbalancer.server.port=80
        - traefik.http.middlewares.${ENV:-dev}_${STACK}_whoami.stripprefix.prefixes=/${STACK}
        - traefik.http.routers.${ENV:-dev}_${STACK}_whoami.entrypoints=http
        - traefik.http.routers.${ENV:-dev}_${STACK}_whoami.rule=PathPrefix(`/${STACK}/whoami`)
        - traefik.http.routers.${ENV:-dev}_${STACK}_whoami.middlewares=${ENV:-dev}_${STACK}_whoami@docker
Run Code Online (Sandbox Code Playgroud)

希望它可以变成如下所示,default在部署堆栈时使用 Docker 分配的隐式服务名称的魔力在哪里:

        - traefik.enable=true
        - traefik.http.services.default.loadbalancer.server.port=80
        - traefik.http.middlewares.default.stripprefix.prefixes=/${STACK}
        - traefik.http.routers.default.entrypoints=http
        - traefik.http.routers.default.rule=PathPrefix(`/${STACK}/whoami`)
        - traefik.http.routers.default.middlewares=default@docker
Run Code Online (Sandbox Code Playgroud)

我尝试了以下操作,但显然 go 模板没有被替换:

        - traefik.enable=true
        - traefik.http.services.{{ .Name }}.loadbalancer.server.port=80
        - traefik.http.middlewares.{{ .Name }}.stripprefix.prefixes=/${STACK}
        - traefik.http.routers.{{ .Name }}.entrypoints=http
        - traefik.http.routers.{{ .Name }}.rule=PathPrefix(`/${STACK}/whoami`)
        - traefik.http.routers.{{ .Name }}.middlewares={{ .Name }}@docker
Run Code Online (Sandbox Code Playgroud)

Cor*_*uet 0

我没有测试它,但根据这个文档,Go 模板仅在动态(Yaml/Toml)配置文件中受支持。

所以我建议你尝试添加一个动态配置文件(请参阅此处)并编写如下内容:

http:
  routers:
    {{range $i, $e := until 100 }}
    router{{ $e }}:
      middlewares = {{ $e }}
    {{end}}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助