我正在尝试构建一个Traefik动态配置,该配置在开发中具有"Host(app.localhost)"
的规则,但在生产中使用"Host(realname.com)"
的规则。我也在使用Docker,但我认为这与我的问题无关。我的问题是:在动态配置中是否有惯用的方式使用环境变量?
文档中提到了Go模板,但除此之外我不了解。确实缺乏。我还考虑过类似envsubst的问题,但希望不必安装其他工具。
我正在使用Traefik 2.0+。另外,我必须使用文件提供程序,因为我在本地为TLS使用自签名证书。从Traefik的文档中:
在上面的示例中,我们使用文件提供程序来处理这些定义。这是配置证书(以及选件和存储)的唯一可用方法。但是,在Kubernetes中,证书可以而且必须由秘密提供。
答案 0 :(得分:7)
使用traefik v2.0 + docker镜像,您可以简单地使用docker-compose
并在.env
文件中定义环境变量。然后使用以下示例中的标签。
使用文件提供程序使用traefik CLI命令为本地主机添加自签名TLS证书:
--providers.file.filename=/etc/traefik/certs.toml
.env
文件在本地: # Environment variables for docker-compose.yml
LOG_LEVEL=DEBUG
NETWORK=net
## dashboard configs
DASHBOARD_HOST=app.localhost
CONFIG_PATH=./config
CERT_PATH=./certs
生产中的.env
文件: # Environment variables for docker-compose.yml
# LOG_LEVEL=INFO
LOG_LEVEL=ERROR
NETWORK=net
## dashboard configs
DASHBOARD_HOST=realname.com
CONFIG_PATH=./config
CERT_PATH=./certs
version: "3.5"
services:
traefik:
# Setting container_name disables running multinple instances of this service
container_name: traefik
image: traefik:v2.1
command:
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --log.level=${LOG_LEVEL}
- --providers.docker
- --providers.docker.exposedbydefault=false
- --providers.file.filename=/etc/traefik/certs.toml
- --api
ports:
- "80:80"
- "443:443"
networks:
- net
volumes:
- "${CERT_PATH}:/certs"
- "${CONFIG_PATH}:/etc/traefik"
- "/var/run/docker.sock:/var/run/docker.sock:ro"
labels:
# set this lebel to `false` and the rest is history
traefik.enable: true
# middleware redirect
traefik.http.middlewares.redirect-to-https.redirectscheme.scheme: https
# redirection HTTP to HTTPS
traefik.http.routers.http_catchall.rule: hostregexp(`{host:.+}`)
traefik.http.routers.http_catchall.entrypoints: web
traefik.http.routers.http_catchall.middlewares: redirect-to-https
# dashboard
traefik.http.routers.traefik.rule: Host(`${DASHBOARD_HOST}`)
traefik.http.routers.traefik.entrypoints: websecure
traefik.http.routers.traefik.service: api@internal
traefik.http.routers.traefik.tls: true
networks:
net:
external: false
name: ${NETWORK}
[tls.stores.default.defaultCertificate]
certFile = "/certs/cert.crt"
keyFile = "/certs/cert.key"
-----BEGIN CERTIFICATE-----
<THE CERTIFICATE STRING>
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
<THE RSA PRIVATE KEY STRING>
-----END RSA PRIVATE KEY-----
docker-compose
会将${DASHBOARD_HOST}
之类的所有变量替换为.env
文件中定义的值。
然后,您可以使用docker-compose config
来验证您的配置
使用:docker-compose up -d
-d
标志用于分离模式,在后台运行容器
源文件:
您可以在github上参考此repository来找到本示例的详细版本,以及如何使用traefik v2
进行自签名或自动获取Let's Encrypt通配符来设置docker-compose
证书。
答案 1 :(得分:0)
除非traefik支持某种使用环境变量进行动态配置的方法,例如static-configurations,否则您通常在启动时会遇到sed
或envsubst
模板配置。