在Traefik动态配置中使用环境变量

时间:2020-02-18 04:40:59

标签: docker traefik

我正在尝试构建一个Traefik动态配置,该配置在开发中具有"Host(app.localhost)"的规则,但在生产中使用"Host(realname.com)"的规则。我也在使用Docker,但我认为这与我的问题无关。我的问题是:在动态配置中是否有惯用的方式使用环境变量?

文档中提到了Go模板,但除此之外我不了解。确实缺乏。我还考虑过类似envsubst的问题,但希望不必安装其他工具。

我正在使用Traefik 2.0+。另外,我必须使用文件提供程序,因为我在本地为TLS使用自签名证书。从Traefik的文档中:

在上面的示例中,我们使用文件提供程序来处理这些定义。这是配置证书(以及选件和存储)的唯一可用方法。但是,在Kubernetes中,证书可以而且必须由秘密提供。

2 个答案:

答案 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

docker-compose.yml:

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}

config / certs.toml:

[tls.stores.default.defaultCertificate]
  certFile = "/certs/cert.crt"
  keyFile = "/certs/cert.key"

certs / cert.crt:

-----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,否则您通常在启动时会遇到sedenvsubst模板配置。

相关问题