
pex 文件默认完整继承宿主进程的环境变量(包括 docker 容器内注入的变量),无需特殊配置即可通过 os.environ 直接访问,真正实现“一份 pex、多环境部署”。
pex 文件默认完整继承宿主进程的环境变量(包括 docker 容器内注入的变量),无需特殊配置即可通过 os.environ 直接访问,真正实现“一份 pex、多环境部署”。
PEX(python EXecutable)是一种将 Python 应用及其依赖打包为单文件可执行程序的技术,广泛用于容器化部署场景。一个常见误区是认为 PEX 运行时会“隔离”或“清空”环境变量——实际上,PEX 本身不修改 os.environ,它完全复用启动时 Python 解释器所见的环境上下文。这意味着:只要环境变量在 python your_app.pex 命令执行前已存在(无论是 shell 导出、Docker -e 参数注入,还是 kubernetes Downward API 注入),你的 Python 代码就能原样读取。
以下是一个可验证的端到端示例:
# 1. 创建简单应用:读取环境变量 ANSWER mkdir -p myapp cat > myapp/main.py << 'EOF' import os def main(): print(f"ANSWER = {os.environ.get('ANSWER', 'NOT SET')}") if __name__ == '__main__': main() EOF # 2. 添加 pyproject.toml(声明入口点) cat > myapp/pyproject.toml << 'EOF' [project] name = "myapp" version = "0.1" [project.scripts] myapp = "main:main" EOF # 3. 构建 PEX(需已安装 pex 工具) pex . -o myapp.pex -c myapp # 4. 在宿主机测试:直接注入环境变量并运行 ANSWER=42 python myapp.pex # 输出:ANSWER = 42 # 5. 在 Docker 中使用(关键:必须显式传递) docker build -t myapp-pex - << 'EOF' FROM python:3.11-slim COPY myapp.pex /app/myapp.pex ENTRYPOINT ["/app/myapp.pex"] EOF # 启动容器时通过 -e 传入变量(必须!Docker 默认不透传宿主机环境) docker run -e ANSWER=42 --rm myapp-pex # 输出:ANSWER = 42
⚠️ 重要注意事项:
- Docker 环境变量不会自动继承:docker run 默认 不 将宿主机环境变量传递给容器,必须显式使用 -e VAR_NAME 或 -e VAR_NAME=VALUE 指定;也可用 –env-file 批量加载。
- 避免覆盖关键 PEX 变量:虽然 os.environ 完全可用,但请勿意外覆盖 PEX_ROOT、PEX_INTERPRETER 等 PEX 内部控制变量(它们以 PEX_ 开头),否则可能影响运行时行为。
- 安全建议:敏感配置(如密码、密钥)应通过 Docker Secrets、Kubernetes Secrets 或 HashiCorp Vault 等机制注入,而非明文环境变量;若必须用环境变量,请确保容器运行用户权限最小化,并禁用调试输出泄露敏感值。
总结而言,PEX 天然支持环境变量驱动的配置管理——它不是限制因素,而是助力你实现“构建一次、随处运行(with config)”的理想实践。只需在部署层(Docker/K8s)正确注入变量,应用层保持标准 os.environ 访问即可,无需任何 PEX 特定适配。
立即学习“Python免费学习笔记(深入)”;