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

标签 docker nginx deployment

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

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

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

此外,这种情况让我认为我将不得不在本地与现场不同地配置其他一些东西。

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

最佳答案

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

对于 nginx,请尝试以下操作:

environment:
  - NGINX_CONF=localhost.conf

在这里,localhost.conf 将是您本地机器的 nginx 配置。运行某种 entrypoint.sh,并将 NGINX_CONF 指定的配置符号链接(symbolic link)到 nginx 将选择它的任何位置(通常是/etc/nginx/conf.d 或/etc/nginx/sites-enabled)。
ln -s /etc/nginx/conf.d/running.conf /app/nginx-confs/${NGINX_CONF}

这假设您已将所有配置文件复制到/app/nginx-confs 中的容器中,但它们可以放在您喜欢的任何地方。 localhost.conf 将为您的站点提供 http://localhost .

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

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

还有其他更细粒度的方法可以在运行时管理 nginx 配置文件。像 confd或模板引擎,如 mustache templating engine是选项。在 nginx 中有迂回方式与 env指令和 set_by_lua ,但这对我来说感觉是最老套的解决方案,所以我更喜欢其他解决方案。

关于docker - 如何有条件地在 docker-compose.yml 中运行不同的配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46327704/

相关文章:

php - 静态xml文件中的环境变量

linux - 从端口 80 删除 nginx 并添加 apache

cakephp - nginx 正在从一个虚拟主机重定向到另一个

sockets - Nginx出现 Varnish 错误: failed (24: Too many open files)

windows - Windows 上 Vb.net VS2005 应用程序的 Mono 的最小运行时间?

java - 如何在Web上部署Web服务

postgresql - 如何从 Docker 容器访问主机数据库?

docker - docker-machine,docker-compose和Google Cloud

docker - 什么可能会阻止从Docker容器到外部服务器的连接

c# - 如何在 Windows Azure 中部署 WCF