首页 > 解决方案 > Traefik 2.0 和 Docker 设置中间件不命名路由器

问题描述

我正在将 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

希望它可以变成下面这样,在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

我尝试了以下方法,但显然 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

标签: dockerdocker-swarmtraefik

解决方案


推荐阅读