如何让子目录Docker Compose文件使用上级目录的.env变量?
单.env文件管理嵌套docker-compose模块的可行方案
针对你用嵌套目录管理docker-compose模块、想统一用根目录.env替代子目录.env的需求,现有几个可行方案:
方案1:命令行指定--env-file参数
在main目录下运行docker-compose命令时,显式指定根目录的.env文件,所有被引用的子compose文件会优先使用这个指定的env文件,而不会加载自身目录的.env:
# 单独启动networking模块 docker-compose --env-file .env -f networking/docker-compose.yaml up -d # 如果顶层compose用include引入子模块,直接运行顶层命令即可 docker-compose --env-file .env up -d
方案2:设置全局环境变量COMPOSE_ENV_FILE
通过设置环境变量让docker-compose默认加载根目录的.env,避免每次命令行传参:
# 临时生效(当前shell会话) export COMPOSE_ENV_FILE=/path/to/main/.env # 持久化生效(加到bash/zsh配置文件) echo 'export COMPOSE_ENV_FILE=/path/to/main/.env' >> ~/.bashrc
设置后,所有docker-compose命令都会自动使用指定的.env文件。
方案3:子compose补充容器级env文件引用
如果需要给容器传递根.env里的变量(区别于compose模板变量),可以在子compose的service中显式指定根目录的.env路径:
services: backup-service: env_file: - ../../.env # 根据子目录相对根目录的路径调整
注意:这个是给容器内部用的环境变量,compose模板本身的变量(比如${IMAGE_TAG})还是靠前两个方案来加载根.env。
关于include字段:目前该字段没有支持自定义env文件路径的属性,无法通过配置文件直接指定子compose使用根.env。
是否要在GitHub开放issue下留言:如果上述方案都无法满足你的需求(比如完全不想依赖命令行参数或环境变量,希望纯通过compose配置实现),可以在该issue下补充你的家庭实验室集群场景,帮助官方评估需求优先级;如果现有方案已经能解决问题,就没必要额外留言了。
内容的提问来源于stack exchange,提问作者Ethan Porcaro
相关产品推荐
相关产品推荐

