如何从pyproject.toml和conf.py向Docker Compose传递参数?
实现从pyproject.toml/conf.py提取元数据传递给Docker Compose的方法
完全可以实现从指定文件提取元数据并传递给Docker Compose,下面提供两种实用的落地方案:
方法1:Shell脚本直接提取并传递环境变量
适合快速部署场景,可选择基础Shell工具或专业TOML解析工具实现。
1.1 用基础Shell工具(grep+sed)提取
编写脚本extract_meta.sh,通过正则匹配提取值并传递给Docker Compose:
#!/bin/bash # 从pyproject.toml提取元数据 PROJECT_NAME=$(grep '^name =' pyproject.toml | sed 's/name = "\(.*\)"/\1/') PROJECT_VERSION=$(grep '^version =' pyproject.toml | sed 's/version = "\(.*\)"/\1/') PROJECT_DESCRIPTION=$(grep '^description =' pyproject.toml | sed 's/description = "\(.*\)"/\1/') # 将authors数组转为逗号分隔字符串 AUTHORS=$(grep -A5 'authors =' pyproject.toml | grep -E '\["?.*"?\]' | sed 's/authors = \[\(.*\)\]/\1/' | sed 's/"//g' | sed 's/, /,/g') # 可选:从docs/conf.py提取(替换上面的pyproject.toml提取逻辑即可) # PROJECT_NAME=$(grep '^project =' docs/conf.py | sed "s/project = '\(.*\)'/\1/") # PROJECT_VERSION=$(grep '^version =' docs/conf.py | sed "s/version = '\(.*\)'/\1/") # AUTHORS=$(grep '^author =' docs/conf.py | sed "s/author = '\(.*\)'/\1/") # 导出变量并启动服务 export PROJECT_NAME PROJECT_VERSION PROJECT_DESCRIPTION AUTHORS docker-compose up -d
使用步骤:
- 给脚本添加执行权限:
chmod +x extract_meta.sh - 运行脚本:
./extract_meta.sh
1.2 用tomlq(更可靠的TOML解析)
如果依赖yq工具(含tomlq),可以避免正则匹配的局限性,更稳定地解析TOML结构:
#!/bin/bash # 从pyproject.toml提取元数据 PROJECT_NAME=$(tomlq -r '.project.name' pyproject.toml) PROJECT_VERSION=$(tomlq -r '.project.version' pyproject.toml) PROJECT_DESCRIPTION=$(tomlq -r '.project.description' pyproject.toml) AUTHORS=$(tomlq -r '.project.authors | join(", ")' pyproject.toml) # 导出变量并启动服务 export PROJECT_NAME PROJECT_VERSION PROJECT_DESCRIPTION AUTHORS docker-compose up -d
说明:tomlq可通过pip install yq或系统包管理器(如Ubuntu的apt install yq)安装。
方法2:Python脚本生成.env文件
Docker Compose会自动读取当前目录的.env文件,用Python解析元数据并生成该文件,适合复杂场景或需要统一数据源的情况:
编写脚本extract_meta.py:
import tomllib import os # 读取pyproject.toml作为数据源 with open('pyproject.toml', 'rb') as f: pyproject_data = tomllib.load(f) project_name = pyproject_data['project']['name'] project_version = pyproject_data['project']['version'] project_description = pyproject_data['project']['description'] authors = ', '.join(pyproject_data['project']['authors']) # 可选:从docs/conf.py提取(替换上面的pyproject.toml读取逻辑) # conf_vars = {} # with open('docs/conf.py', 'r') as f: # exec(f.read(), conf_vars) # project_name = conf_vars['project'] # project_version = conf_vars['version'] # authors = conf_vars['author'] # project_description = pyproject_data['project']['description'] # 从pyproject补全描述 # 生成.env文件 env_content = f'''PROJECT_NAME="{project_name}" PROJECT_VERSION="{project_version}" PROJECT_DESCRIPTION="{project_description}" AUTHORS="{authors}" ''' with open('.env', 'w') as f: f.write(env_content) # 启动Docker Compose服务 os.system('docker-compose up -d')
使用步骤:直接运行脚本python extract_meta.py,脚本会自动生成.env并启动服务。
补充说明
- 建议以
pyproject.toml作为单一元数据源,避免pyproject.toml和conf.py的数据不一致问题 - 如果需要在镜像构建阶段使用这些变量,需在Dockerfile中用
ARG声明,例如:ARG PROJECT_NAME ARG PROJECT_VERSION ENV PROJECT_NAME=$PROJECT_NAME ENV PROJECT_VERSION=$PROJECT_VERSION
内容的提问来源于stack exchange,提问作者Bosser445
相关产品推荐
相关产品推荐

