我有一个非关键的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一起使用。我不确定我的想法-删除外壳是一项很好的安全功能,因此即使我不认为可以轻易利用它,我也很犹豫将其重新添加。
答案 0 :(得分:0)
我找不到使用环境变量修改Traefik配置文件路径的方法。但是,我找到了一个基于卷的解决方案,该解决方案似乎是完全独立的。
我在Docker Compose文件中设置了另一个名为shell
的映像:
shell:
build:
context: docker/shell
volumes:
# On-host volume for generating config
- "./docker/traefik/compiled:/root/compiled-host"
此功能具有绑定挂接卷,可捕获生成的配置文件。
接下来,我为新服务创建了一个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
这将为两个环境创建配置文件,作为构建映像的一部分。
启动Docker Compose时,该服务将短暂启动,但很快将正常无害地退出。无论如何,它都应临时运行。
我已经拥有特定于环境的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
然后,我创建了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
最后,当Traefik作为Compose应用程序的一部分启动时,它将在通常的位置/etc/traefik/traefik.toml
中找到其配置文件,但这实际上是主机上生成的副本的文件卷