git分支通过映射为标准环境名(如dev→development)来加载对应.env文件,可在ci/cd中设置env_state变量或python中读取分支名自动加载,docker compose需显式指定.env文件,且须避免分支名直接用作环境标识。
git 分支本身不直接参与环境变量加载,但可以通过 ci/cd 流程或启动逻辑,把分支名映射为环境标识(如 dev、test、main → production),再据此加载对应 .env 文件。核心是“用分支决定环境名,再用环境名加载配置”。
CI/CD 中按分支设置 ENV_STATE
在流水线脚本里显式设置环境变量,作为后续步骤的输入:
- GitLab CI:在
.gitlab-ci.yml中用variables按分支赋值
或更稳妥地直接写死:
-
dev分支 →ENV_STATE=development -
test分支 →ENV_STATE=staging -
main分支 →ENV_STATE=production
这样后续 Python 启动或 Docker Compose 都能读到 ENV_STATE 并加载 .env.development 等文件。
Python 启动时自动识别分支并加载
不依赖外部传参,直接从 Git 工作区读当前分支名(适合本地开发或简单部署):
- 用
git rev-parse --abbrev-ref HEAD获取分支名 - 映射为标准环境名(避免分支含特殊字符导致路径问题)
- 拼出
.env.{env}路径,仅当存在时加载
示例代码片段:
import subprocessfrom pathlib import Path
from dotenv import load_dotenv
try:
branch = subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']).decode().strip()
env_map = {'dev': 'development', 'test': 'staging', 'main': 'production'}
env_name = env_map.get(branch, 'development')
dotenv_path = Path(f'.env.{env_name}')
if dotenv_path.exists():
load_dotenv(dotenv_path)
except Exception:
pass # 无 Git 环境时跳过
Docker Compose 按分支注入配置
在 CI 中生成临时 docker-compose.override.yml 或用 --env-file 动态指定:
- GitLab CI 示例:
docker compose --env-file .env.$ENV_STATE up -d - 或统一用
.env定义ENVIRONMENT=$ENV_STATE,再让应用层读取它去加载子文件
注意:.env 文件本身只用于 Compose 变量替换(如 ${DB_PORT}),不会自动加载 .env.production —— 这步必须由你的应用代码或 entrypoint 脚本完成。
安全与可维护建议
- 分支名不能直接当环境名用(比如
feature/login-rewrite无法对应合法文件名),必须做白名单映射 -
.env.*文件不要提交敏感值;生产环境应通过服务器环境变量或密钥管理服务注入 - 所有加载逻辑加存在性判断,避免因文件缺失导致静默使用系统默认值
- 本地开发推荐用
ENVIRONMENT=development手动设置,和 CI 行为一致,减少环境差异











