如何在docker-compose.yml中有条件地运行不同的配置?

时间:2017-09-20 16:51:19

标签: docker nginx deployment

我在实时服务器上通过certbot配置了SSL。我在docker-compose.yml的{​​{1}}部分中有一个卷映射:

volumes:
  ...
  - /etc/letsencrypt:/etc/letsencrypt

这在实时服务器上工作正常,但我在本地计算机上有不同的设置,我运行应用程序并在http://localhost上看到它。我想我的本地机器上不需要SSL,所以如果它在本地运行,我可能会排除这部分设置。

此外,这个案例让我觉得我必须在本地配置其他一些不同的东西而不是生活。

那么,问题是如何正确区分本地和现场设置之间的这些差异,并根据环境自动应用它们(半)?

2 个答案:

答案 0 :(得分:0)

环境变量通常是创建这样的简单运行时可移植性的好方法,并且许多工具/应用程序/包仅通过环境变量支持运行时配置。不幸的是,nginx不是那些应用程序之一

对于nginx,请尝试以下方法:

environment:
  - NGINX_CONF=localhost.conf

这里,localhost.conf将是您本地计算机的nginx配置。运行某种类型的entrypoint.sh,并将NGINX_CONF指定的配置符号链接到nginx将获取它的地方(通常是/etc/nginx/conf.d或/ etc / nginx / sites-enabled)。

ln -s /etc/nginx/conf.d/running.conf /app/nginx-confs/${NGINX_CONF}

这假设您已将所有confs复制到/ app / nginx-confs中的容器中,但它们可以存在于您喜欢的任何位置。 localhost.conf将以http://localhost为您的网站提供服务。

对于您的实时服务器,请传递NGINX_CONF = liveserver.conf。这个conf会服务https://www.liveserver.com或你主持的任何东西。

此时,您可以使用环境变量选择在启动容器时运行的nginx配置。即使您不想这样做,希望它能让您朝着正确的方向前进,并将环境变量视为在运行时配置的一种方式。

在运行时还有其他更细粒度的方法来管理nginx confs。像confd这样的东西或mustache templating engine之类的模板引擎都是选项。使用env指令和set_by_lua在nginx中有迂回的方式,但这对我来说是最苛刻的解决方案,所以我更喜欢其他方式。

答案 1 :(得分:0)

您可以根据需要撰写Makefile以生成不同的docker-compose.yml文件。

生成文件:

# Makefile
-include config.mk

A_CONFIG_VAR ?= default_value

all: docker-compose.yml

docker-compose.yml: docker-compose.yml.in config.mk
        @echo 'Generating docker-compose.yml'
        @sed -e 's|@@A_CONFIG_VAR@@|$(A_CONFIG_VAR)|g' $< > $@

config.mk:将配置变量放在此文件中。

# config.mk
A_CONFIG_VAR = "a_value"

docker-compose.yml.in:像这样写一个输入docker-compose.yml文件

volumes:
  - /path/to/somewhere:@@A_CONFIG_VAR@@

更改config.mk的内容以满足您的需求。然后运行

make

这应该为您生成docker-compose.yml文件。