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

我已经在活动服务器上通过certbotconfigurationSSL。 我在docker-compose.yml nginx部分有一个卷映射:

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

这在活服务器上工作得很好,但是我在本地机器上有不同的设置,我运行应用程序并在http://localhost上看到它。 我想我的本地机器上不需要SSL,所以如果它在本地运行的话,我可能会排除这部分安装。

此外,这种情况下,我想我将不得不在本地和现场configuration一些其他的东西。

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

环境variables通常是创build简单运行时可移植性的一种好方法,许多工具/应用程序/程序包仅仅通过环境variables来支持运行时configuration。 不幸的是,nginx不是这些应用程序之一

对于nginx,请尝试如下所示:

 environment: - NGINX_CONF=localhost.conf 

在这里,localhost.conf是你本地机器的nginxconfiguration。 运行某种types的entrypoint.sh,并将NGINX_CONF指定的configuration符号链接到nginx将要检索的configuration文件(通常是/etc/nginx/conf.d或/ etc / nginx / sites-enabled)。

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

假设你已经将所有的conf复制到了/ app / nginx-confs中的容器中,但是他们可以随时随地生活。 localhost.conf将为您的网站提供http:// localhost 。

对于你的服务器,传递NGINX_CONF = liveserver.conf。 这个conf将服务https://www.liveserver.com或任何你主办的。

此时,您可以select使用环境variables启动容器时运行的nginxconfiguration。 即使你不想这样做,希望它能让你朝着正确的方向前进,并考虑环境variables作为运行时configuration的一种方式。


在运行时还有其他一些更精细的pipe理nginx conf的方法。 像confd或像胡须模板引擎的模板引擎是选项。 在env指令和set_by_lua nginx中有一些迂回的方法,但是这感觉就像是对我最hacky的解决scheme,所以我更喜欢其他的。

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

Makefile文件:

 # 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:把你的configurationvariables放在这个文件中。

 # config.mk A_CONFIG_VAR = "a_value" 

docker-compose.yml.in:像这样编写一个inputdocker-compose.yml文件

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

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

 make 

这应该为你生成一个docker-compose.yml文件。