我刚开始使用Docker,所以请告诉我是否应该做一些完全不同的事情,但是这里是…
我想在一个nginx容器中创建一个卷,它将所有启用站点的配置文件映射到容器上的位置。问题是,这些文件分散在多个文件夹中,这些文件夹可以随机命名。但是等等!我可以肯定地告诉你,.conf
文件总是在一个特定的文件夹中,只有1层深(因为这是我喜欢的布局)。下面是一个基本的布局来解释我的意思:
- images/
- nginx/
- docker-compose.yml
- sites/
- site_a/
- vhost/
site_a.conf
- site_b/
- vhost/
site_b.conf
我在为nginx声明卷时尝试过这样做:
- ../sites/*/vhost/:/etc/nginx/sites-enabled
但我得到以下错误:
ERROR: for nginx Cannot start service nginx: mkdir /c/Users/Yates/Documents/docker/sites/*: protocol error
我有点明白错误,但我找不到任何东西告诉我如何完成我最终想要的。
你肯定不能这么做。
您可以做的是symlink将所有.conf文件复制到主机上的一个目录中,并将该目录用作卷挂载点。或者直接挂载sites/
根目录
这是一个概念性问题,你的概念非常脆弱,很可能会导致问题。
你做错的是:
- httpd服务器的配置保存在站点的数据/配置结构中,或者至少在中嵌套。
- 您正在尝试使用静态+嵌套文件夹配置动态数量的"服务"站点。您混淆了"配置"和数据。尝试将您的配置放入consul/etcd/zookeeper中,并使用tiller (confd/consul-template) 生成配置。
如果你想强制,你可以:
方式)在nginx中挂载包含sites文件夹的卷,只读(不管这个卷怎么叫)
然后你在nginx容器中运行一个入口点脚本,一些find
表达式遍历你的"站点"文件夹,找到任何站点,使用vhost文件夹并从那里创建一个符号链接到/etc/nginx/sites-enabled
您还需要考虑删除,因此为符号链接选择一个好的名称空间,如mysite.automated.conf
,并且在入口点创建符号链接之前,运行rm /etc/nginx/sites-enabled/*automated.conf
以清除可能过时/已删除的符号链接。你也可以用更新的方式来做,但那是为了更复杂的…
b)
如果可以的话,一般来说,改变网站的结构,把所有的"vhosts"放到一个文件夹里,比如你要有
sites/vhosts/*.sites.conf
sites/data/siteA/
sites/data/siteA/
,然后在nginx和symlink站点/vhosts上挂载只读卷到/etc/nginx/site-enabled(文件夹本身)