Traefik配置文件的默认位置可以在官方Docker文件中更改吗?

时间:2019-07-25 11:18:58

标签: docker traefik

我有一个非关键的Docker Compose项目,在Traefik规则中,开发人员和生产人员之间的规则可以接受(我需要在产品上使用Lets Encrypt,而在开发人员上则不需要Lets Encrypt)。我正在使用[file]配置提供程序。

目前,我正在为dev和prod创建单独的构建,因此:

# This is fetched from the Compose config
ARG BUILD_NAME

RUN if [ "$BUILD_NAME" == "prod" ]; then \
    echo Compiling prod config... ; \
    sh /root/compile/prod.sh > /etc/traefik/traefik.toml ; \
else \
    echo Compiling dev config... ; \
    sh /root/compile/dev.sh > /etc/traefik/traefik.toml ; \
fi

尽管该项目不是很重要,但是每个环境的构建有点麻烦,我宁愿使用适用于所有环境的单个映像的标准容器方法。

为此,我正在考虑做这样的事情:

FROM traefik:1.7

# This is set in the Docker Compose config
ENV ENV_NAME

# Let's have a sig handler
RUN wget -O /usr/local/bin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v1.2.2/dumb-init_1.2.2_amd64
RUN chmod +x /usr/local/bin/dumb-init

COPY docker/traefik/start.sh /root/start.sh

ENTRYPOINT ["/usr/local/bin/dumb-init", "--"]
CMD ["/root/start.sh"]

start.sh会在运行时运行我的“ compile” shell命令(这会根据环境选择一些配置)。但是,正式的Traefik图像无法运行shell-Go源码中有经过编译的blob-因此无法正常工作。是否存在可以更改/etc/traefik/traefik.toml的环境变量,还是在Docker中执行此操作的行业标准方法?

我确实考虑过使用卷,但这意味着如果不进行其他设置,容器将不会“即插即用”-我喜欢它目前是独立的。但是,如果没有其他选择,我可以使用它。我可以在主机上运行配置“编译器”。

另一种方法是将Traefik安装在具有外壳的映像中-也许可以与Alpine一起使用。我不确定我的想法-删除外壳是一项很好的安全功能,因此即使我不认为可以轻易利用它,我也很犹豫将其重新添加。

1 个答案:

答案 0 :(得分:0)

我找不到使用环境变量修改Traefik配置文件路径的方法。但是,我找到了一个基于卷的解决方案,该解决方案似乎是完全独立的。

  1. 我在Docker Compose文件中设置了另一个名为shell的映像:

    shell:
      build:
        context: docker/shell
      volumes:
        # On-host volume for generating config
        - "./docker/traefik/compiled:/root/compiled-host"
    

    此功能具有绑定挂接卷,可捕获生成的配置文件。

  2. 接下来,我为新服务创建了一个Dockerfile

    FROM alpine:3.10
    
    COPY compile /root/compile
    COPY config /root/config
    
    # Compile different versions of the config, ready to copy into an on-host volume
    RUN mkdir /root/compiled && \
        sh /root/compile/dev.sh > /root/compiled/traefik-dev.toml && \
        sh /root/compile/prod.sh > /root/compiled/traefik-prod.toml
    

    这将为两个环境创建配置文件,作为构建映像的一部分。

  3. 启动Docker Compose时,该服务将短暂启动,但很快将正常无害地退出。无论如何,它都应临时运行。

  4. 我已经拥有特定于环境的YAML配置文件docker-compose-dev.yml and docker-compose-prod.yml , which are explicitly specified in the Compose command with -f`。然后,我使用该文件将生成的主机文件公开给Traefik。这是开发人员:

      traefik:
        volumes:
          # On-host volume for config
          - "./docker/traefik/compiled/traefik-dev.toml:/etc/traefik/traefik.toml"
    

    traefik-prod.toml

  5. 的操作大致相同
  6. 然后,我创建了per-env命令,将配置从shell映像复制到主机卷中:

    #!/bin/sh
    
    docker-compose -f docker-compose.yml -f docker-compose-prod.yml run shell cp /root/compiled/traefik-prod.toml /root/compiled-host/traefik-prod.toml
    
  7. 最后,当Traefik作为Compose应用程序的一部分启动时,它将在通常的位置/etc/traefik/traefik.toml中找到其配置文件,但这实际上是主机上生成的副本的文件卷