【问题标题】:What is the recommended way to configure multiple domains from an env var in Traefik?从 Traefik 中的 env var 配置多个域的推荐方法是什么?
【发布时间】:2021-06-26 04:10:10
【问题描述】:

由于我需要配置多个域,我想在环境变量中定义这些域的列表。

根据routers section of the documentation,我们应该使用这种格式:

Host(`example.com`, ...)

是否有推荐的方法从环境变量填充这个预期列表(我在 Docker Compose 文件中使用这个配置)?

自:

要设置规则的值,请使用反引号 ` 或转义的双引号 ”。

我想提一下以下内容不能与 Host(${DOMAINS}) 一起使用,因为反引号中包含的域被解释为命令:

$ export DOMAINS="`example.com`, `example2.com`"

zsh: command not found: example.com
zsh: command not found: example2.com

以下格式适用于export

$ export DOMAINS="\"example.com\", \"example2.com\""
$ echo $DOMAINS
"example.com", "example2.com"

但是从带有DOMAINS="\"example.com\", \"example2.com\"".env 文件中,我进入了 Traefik:

Cannot issue for \"\\\"example.com\\\", \\\"example2.com\\\"\": Domain name contains an invalid character"

【问题讨论】:

    标签: docker-compose environment-variables traefik


    【解决方案1】:

    我终于找到了一种方法,通过转义导出命令中的反引号字符:

    export DOMAINS="\`example.com\`, \`example2.com\`"
    

    但是,如果我们想使用 .env 文件,我们需要删除逗号后的空格,因为必须引用参数以支持空格,并且万一在"` 上的任何额外转义,即使是多个,都不起作用。

    所以,在 .env 文件中,它必须是:

    DOMAINS=`example.com`,`example2.com`
    

    【讨论】:

    • 你是如何处理 traefik.yml 文件中的环境变量的?当我使用rule: "Host(`www.${DOMAIN_NAME}`)" 时它不会被替换,而是我得到Cannot issue for \"www.${domain_name}\"
    • 在这个文件中你应该使用:rule: "Host(``{{ env "DOMAIN_NAME" }}``)"。见Go Templating
    【解决方案2】:

    使用环境变量,您可以使用 -e (--environment) 参数运行 docker-compose:

    export MY_DOMAIN="example.com"
    docker-compose --environment EXAMPLE_DOMAIN=$MY_DOMAIN up -d
    

    MY_DOMAIN="example.com" docker-compose --environment EXAMPLE_DOMAIN=$MY_DOMAIN up -d
    

    变量 $EXAMPLE_DOMAIN 将在 docker-compose 环境中可用:

    docker-compose.yml:

    version: "3.7"
    services:
      nginx:
        image: nodejs
        labels:
          - traefik.http.routers.example_https.rule=Host(`${EXAMPLE_DOMAIN }`)
    

    您也可以通过动态 toml 文件设置域名,但您需要使用您的变量通过自定义脚本创建此文件。如果您需要动态更新域名,请将动态配置卷共享给主机:

    ## Dynamic configuration
    [http.routers]
      [http.routers.routerbar]
        rule = "Host(`example.com`)
        [http.routers.routerbar.tls]
          certResolver = "bar"
          [[http.routers.routerbar.tls.domains]]
            main = "example.com"
            sans = ["*.example.com"]
    

    可用于配置域的动态 yaml 文件,但您也需要从自己可用的环境变量中创建它:

    http:
      routers:
        routerbar:
          rule: "Host(`example.com`)"
          tls:
            certResolver: "bar"
            domains:
              - main: "example.com"
                sans:
                  - "*.example.com"
    

    此外,可以在映像构建阶段分配域名。您需要通过 docker-compose.yml 配置在本地 Dockerfile 上传递构建参数。

    【讨论】:

    • 谢谢,但这根本不能回答问题。
    猜你喜欢
    • 2011-06-12
    • 2018-09-06
    • 2011-07-01
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多