我想将卷添加到我的服务,但前提是最终用户必须为其提供文件夹。否则,不应装入任何卷,因为已准备好的映像在默认文件夹中具有有效数据。
也就是说,我想做类似于(伪代码)的事情:
services:
my_awesome_service:
volumes:
if ${VARIABLE} => ${VARIABLE}:/app/folder
- 此类条件语句是否可在停靠器合成文件中定义?**
我认为实现这一点的唯一方法是首先定义一个基本的docker-compose文件,它没有卷挂载,并且只有在定义了$VARIABLE
的情况下才调用第二个docker-compose文件。这对于单个或少数几个条件来说很好,但如果有很多条件,就会变得很糟糕。
有办法吗?
7条答案
按热度按时间x9ybnkn61#
穷人的解决方案:
或者:
e37o9pze2#
目前还不存在这样的东西。我可以想到的实现这一点的选项包括:
1.制作大量的合成文件片段,并将所需的部分合并在一起以构建最终文件。
1.动态生成合成文件,像jsonnet这样的文件可能是个不错的起点。
1.跳过编写,直接动态生成
docker run
命令,这开始缺乏可移植性,但有些用例更容易自己编写脚本。1.提交一个PR到compose和docker/cli github repos来扩展compose功能,用golang模板语法来做这件事对我来说最有意义。
20jt8wwn3#
是的,我不认为docker-compose的格式支持条件语句。
但是,有两种解决方案:
1.将一个“complex”(类似列表)变量传递给docker-compose,如下例所示:
docker-compose.yaml:
猛击:
(作者为github上的原创海报,@shin-)
1.在docker映像中准备一个名为
folder_defaults
之类的文件夹中的默认文件夹,然后始终在docker-compose.yml中定义卷,最后在docker映像中使用一个内部脚本来检查卷文件夹是否为空,如果为空,则将ln -s
设置为folder_defaults
;否则就保持原样。条件脚本示例:
l3zydbqr4#
如果您使用Rancher进行编排,则可以在Rancher版本的docker-compose中使用转义
{{...}}
作为条件语句。了解更多关于集成GO模板系统here的信息。
hfsqlsce5#
在docker-compose中使用条件stmts是可能的。检查变量替换。文档中只提供了最简单的if-else。由于我没有尝试过涉及字符串的复杂表达式,所以我不能确定。但以下是在尝试条件变量时你可能要记住的几点:
env_file
选项设置。此文件中的变量在environment
选项下的变量之前导出到docker容器中。这意味着environment
中的变量将覆盖env_file
中的变量。vngu2lb86#
我们可以在docker-compose.yml文件中使用条件语句,如下所示:
dba5bblo7#
使用JavaScript或Python等编程语言生成yaml文件
例如,在JavaScript中,您可以在json中创建配置,然后将其转换为yaml,并在部署之前写入文件系统中的某个位置