如何在 docker-compose 标签中设置 Traefik 2.4 服务名称

Jan*_* K. 6 docker docker-compose traefik

有没有办法traefik.http.services在 docker-compose 标签中设置名称?

可以说我有简单的 docker-compose.yml:

version: '3.4'

services:
  traefik:
    image: "traefik:v2.4.2"
    command:
      - --log.level=warning
      - --api.insecure=true
      - --api.dashboard=true
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --entrypoints.web.address=:80
    ports:
      - "80:80"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    labels:
      - traefik.enable=true

      # Dashboard
      - traefik.http.routers.traefik.rule=Host(`traefik.localhost`)
      # this is interesting - traefik is naming his api service somehow
      - traefik.http.routers.traefik.service=api@internal
      - traefik.http.services.traefik.loadbalancer.server.port=8080

  whoami:
    image: "traefik/whoami"
    labels:
      - traefik.enable=true
      - traefik.http.routers.webwho.rule=Host(`who.localhost`)
Run Code Online (Sandbox Code Playgroud)

当我可以在http://traefik.localhostdocker-compose up看到仪表板并在http://who.localhost看到“whoami”之后,这效果很好

问题是“whoami”traefik 服务的名称 -whoami-{name_of_project}当我想在其他标签中引用它时,这就是问题。

例如,我想使用新的 'foo' docker 服务作为 404.html 提供程序(在本例中我将使用traefik/whoami图像,这很愚蠢,但是嘿,这只是示例;))

我通过使用低优先级“catch all”路由器来做到这一点:

version: '3.4'

services:
  traefik:
    image: "traefik:v2.4.2"
    command:
      - --log.level=warning
      - --api.insecure=true
      - --api.dashboard=true
      - --api.debug=true
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --entrypoints.web.address=:80
    ports:
      - "80:80"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    labels:
      - traefik.enable=true

      # Dashboard
      - traefik.http.routers.traefik.rule=Host(`traefik.localhost`)
      # this is interesting - traefik is naming his api service somehow
      - traefik.http.routers.traefik.service=api@internal
      - traefik.http.services.traefik.loadbalancer.server.port=8080

  whoami:
    image: "traefik/whoami"
    labels:
      - traefik.enable=true
      - traefik.http.routers.webwho.rule=Host(`who.localhost`)

  foo:
    image: "traefik/whoami"
    labels:
      - traefik.enable=true
      - traefik.http.routers.error-router.rule=HostRegexp(`{host:.+}`)
      - traefik.http.routers.error-router.priority=1
      - traefik.http.routers.error-router.middlewares=error-pages-middleware
      - traefik.http.middlewares.error-pages-middleware.errors.status=400-599
      # nope!
      # actual name of this service (as seen in traefik dashboard) is something like 'foo-test'
      # and this will not work.
      # (btw, there is very clear Error Message in traefik console about service foo does not exists,
      # making debugging pleasant experience :) Thank you Traefik!)
      - traefik.http.middlewares.error-pages-middleware.errors.service=foo
      - traefik.http.middlewares.error-pages-middleware.errors.query=/{status}.html
Run Code Online (Sandbox Code Playgroud)

但我不知道如何设置 traefik 服务的名称,以便我可以将其引用为traefik.http.middlewares.error-pages-middleware.errors.service=???标签的值 - 服务名称foo-test不是静态的(“test”是包含 docker-compose.yml 的目录的名称)并且它不断变化有时(特别是与 Visual Studio .dcproj 一起使用时)

那么 - 有什么方法可以设置服务名称吗?


我尝试了什么:

谷歌和文档。不,但也许是因为我不知道该问什么。

设置container_name: foo根本没有帮助。

有趣的是,如果我添加标签,- traefik.http.services.foo.loadbalancer.server.port=80它会自动将 traefik 服务命名为foo这正是我想要的并且一切正常。但这感觉就像“B 计划”,因为我不想设置端口,我想设置服务的名称。

使用traefic动态配置

[http.services]
  [http.services.foo.loadBalancer]
    [[http.services.foo.loadBalancer.servers]]
      url = "http://foo:80/"
Run Code Online (Sandbox Code Playgroud)

应该可以工作(我没有测试过)——但同样,我不想设置整个网址,我想设置服务名称...

Jan*_* K. 1

看起来(至少在 v2.4 中)除了

labels:
  - traefik.http.services.<<name_of_service>>.loadbalancer.server.port=80
Run Code Online (Sandbox Code Playgroud)

AFAIK 即使在文档中,也只提到了一处:

labels:
  - "traefik.http.routers.myproxy.rule=Host(`example.net`)"
  # service myservice gets automatically assigned to router myproxy
  - "traefik.http.services.myservice.loadbalancer.server.port=80"

Run Code Online (Sandbox Code Playgroud)

(来源: https: //doc.traefik.io/traefik/routing/providers/docker/