You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

使用步骤:

  1. 给脚本添加执行权限:chmod +x extract_meta.sh
  2. 运行脚本:./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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 03:15:24