Traefik docker-compose 只创建一个前端路由而不是 3 个
Traefik docker-compose only creating one frontend route instead of 3
我希望 traefik 将特定路径路由到我的 nginx 服务。
下面的设置适用于我的开发环境,但不适用于实时
环境。
问题是,对于 nginx 服务,它只会创建前端之一
路由,通常只是静态的,或者只是媒体。就好像它找到了一个,创造了它
然后就不再理会其他的了。
如果我重新启动我的容器,那么 traefik 将只随机执行其中一条路线
再次,但从来没有像在我的开发机器上那样全部 3 个。
docker-compose.yml
version: '3'
services:
db:
image: postgres:latest
webapp:
build:
context: ./src/webapp/
env_file:
- .env
volumes:
- "./resources:/mnt/resources/"
depends_on:
- db
links:
- "db:dbhost"
labels:
- "traefik.backend=webapp"
- "traefik.port=8000"
- "traefik.webapp.entryPoints=https"
- "traefik.webapp.frontend.rule=Host:my.domain.example"
nginx:
build:
context: ./src/nginx/
volumes:
- ./resources:/mnt/resources
labels:
- "traefik.backend=nginx"
- "traefik.port=443"
- "traefik.frontend.entryPoints=https"
- "traefik.static.frontend.rule=Host:my.domain.example;PathPrefix:/static"
- "traefik.media.frontend.rule=Host:my.domain.example;PathPrefix:/media"
- "traefik.sw.frontend.rule=Host:my.domain.example;Path:/service-worker.js"
traefik:
image: traefik:1.6.3
restart: always
ports:
- "80:80"
- "443:443"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./src/traefik/traefik.toml:/traefik.toml
- ./src/traefik/acme.json:/acme.json
一个单独的问题,但仍然与 traefik 相关:
Traefik 应该为 main.domain 获取 letsencrypt 证书,并且这样做了
非常适合该域。
但它也在尝试为 db 和 traefik 服务获取证书。
我如何告诉 traefik 不要为这些服务获取证书?
终于想通了。
对于没有生成的前端,我基本上必须为每个前端指定一个后端,然后它们按预期工作。
所以这样:
- "traefik.static.frontend.rule=Host:my.domain.example;PathPrefix:/static"
- "traefik.media.frontend.rule=Host:my.domain.example;PathPrefix:/media"
- "traefik.sw.frontend.rule=Host:my.domain.example;Path:/service-worker.js"
...变成了这个:
- "traefik.static.backend=nginx-static"
- "traefik.static.frontend.rule=Host:my.domain.example;PathPrefix:/static"
- "traefik.media.backend=nginx-media"
- "traefik.media.frontend.rule=Host:my.domain.example;PathPrefix:/media"
- "traefik.sw.backend=nginx-sw"
- "traefik.sw.frontend.rule=Host:my.domain.example;Path:/service-worker.js"
之后一切正常。
我希望 traefik 将特定路径路由到我的 nginx 服务。 下面的设置适用于我的开发环境,但不适用于实时 环境。
问题是,对于 nginx 服务,它只会创建前端之一 路由,通常只是静态的,或者只是媒体。就好像它找到了一个,创造了它 然后就不再理会其他的了。
如果我重新启动我的容器,那么 traefik 将只随机执行其中一条路线 再次,但从来没有像在我的开发机器上那样全部 3 个。
docker-compose.yml
version: '3'
services:
db:
image: postgres:latest
webapp:
build:
context: ./src/webapp/
env_file:
- .env
volumes:
- "./resources:/mnt/resources/"
depends_on:
- db
links:
- "db:dbhost"
labels:
- "traefik.backend=webapp"
- "traefik.port=8000"
- "traefik.webapp.entryPoints=https"
- "traefik.webapp.frontend.rule=Host:my.domain.example"
nginx:
build:
context: ./src/nginx/
volumes:
- ./resources:/mnt/resources
labels:
- "traefik.backend=nginx"
- "traefik.port=443"
- "traefik.frontend.entryPoints=https"
- "traefik.static.frontend.rule=Host:my.domain.example;PathPrefix:/static"
- "traefik.media.frontend.rule=Host:my.domain.example;PathPrefix:/media"
- "traefik.sw.frontend.rule=Host:my.domain.example;Path:/service-worker.js"
traefik:
image: traefik:1.6.3
restart: always
ports:
- "80:80"
- "443:443"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./src/traefik/traefik.toml:/traefik.toml
- ./src/traefik/acme.json:/acme.json
一个单独的问题,但仍然与 traefik 相关:
Traefik 应该为 main.domain 获取 letsencrypt 证书,并且这样做了 非常适合该域。
但它也在尝试为 db 和 traefik 服务获取证书。 我如何告诉 traefik 不要为这些服务获取证书?
终于想通了。
对于没有生成的前端,我基本上必须为每个前端指定一个后端,然后它们按预期工作。
所以这样:
- "traefik.static.frontend.rule=Host:my.domain.example;PathPrefix:/static"
- "traefik.media.frontend.rule=Host:my.domain.example;PathPrefix:/media"
- "traefik.sw.frontend.rule=Host:my.domain.example;Path:/service-worker.js"
...变成了这个:
- "traefik.static.backend=nginx-static"
- "traefik.static.frontend.rule=Host:my.domain.example;PathPrefix:/static"
- "traefik.media.backend=nginx-media"
- "traefik.media.frontend.rule=Host:my.domain.example;PathPrefix:/media"
- "traefik.sw.backend=nginx-sw"
- "traefik.sw.frontend.rule=Host:my.domain.example;Path:/service-worker.js"
之后一切正常。