不要规范化 traefik 规则中的 docker 容器名称

Do not normalize docker container names in traefik rules

我想使用 Traefik v2.5 作为本地反向代理来访问我本地守护进程的所有 docker 容器,在我的浏览器中使用模式 http://container_name.localhost 的域。

这是我的 docker-compose.yml 文件:

version: "3.7"
services:
  traefik:
    image: traefik:v2.5
    restart: always
    network_mode: "host"
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=true"
      - "--providers.docker.defaultrule=Host(`{{ .Name }}.localhost `)"
      - "--entrypoints.web.address=:80"

然后我启动了容器和一个简单的网络服务器,看看它是否工作:

docker-compose up -d
docker run -d --name my_nginx nginx

然后,我就可以访问位于 http://my-nginx.docker.localhost/. However, the name of the docker container uses underscores and not hyphens. This makes it very confusing if you just want to access one of your containers in the browser. Therefore, I want to access the container using http://my_nginx.localhost/ 的网络服务器了。有没有办法禁用 traefik 规则的规范化?

我知道人们通常在 URL 中使用连字符,但 docker 只想使用下划线,这只是我的本地开发环境。我也不想手动添加 traefik 标签,例如

traefik.http.routers.my_nginx.rule==Host(`my_nginx.localhost`)

每当我启动一个简单的开发容器时。

我刚刚检查了 docs,上面写着在 go 模板片段中有可用的 sprig 函数。

因此,您可以利用 go template + sprigs string functions 将连字符替换为下划线。

Host(`{{ .Name | replace "-" "_" }}.localhost `)