Argo如何通过Script模板在yaml中pip安装Python依赖库?
问题背景
- 已启动配置好对应访问凭据的基础PostgreSQL Docker容器,需要通过Argo工作流独立完成创建表、写入数据等数据库操作。
- 编写对应Argo YAML配置运行时,出现
no library found psycopg依赖缺失报错。 - 已知提前构建集成运行脚本与依赖安装命令的自定义Docker镜像可解决该问题,需确认是否存在无需提前构建镜像、纯使用Script模板即可安装所需依赖、运行简单Python脚本的方案。
问题根因
原配置直接使用python:alpine3.6官方基础镜像,该镜像仅内置Python标准库,未预装psycopg2这类第三方PostgreSQL连接依赖,因此脚本运行时会触发依赖缺失报错。
无需预构建镜像的实现方案
完全可以通过调整Script模板的启动逻辑实现,不需要提前构建自定义镜像,核心思路是在容器启动后、执行Python业务逻辑前,自动完成系统依赖与Python依赖的安装。
由于Alpine镜像使用apk作为包管理器,安装psycopg2需要先安装对应的运行依赖,调整后的完整可用配置如下:
apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: generateName: scripts-python- spec: entrypoint: python-script-example templates: - name: python-script-example steps: - - name: creating-emp-tbl template: create-emp-tbl - - name: print template: print-message arguments: parameters: - name: message value: "{{steps.creating-emp-tbl.outputs.result}}" - name: create-emp-tbl script: image: python:3.11-alpine command: [sh, -c] source: | # 安装系统运行依赖与psycopg2预编译包 apk add --no-cache postgresql-libs && \ pip install --no-cache-dir psycopg2-binary # 执行业务Python逻辑 python - <<PYEOF from psycopg2 import connect conn = connect( database="postgres", user="postgres", host="localhost", port=5432, password="mysecretpassword", ) cursor = conn.cursor() try: cursor.execute( "CREATE TABLE EMPLOYEES (id serial PRIMARY KEY, age integer, team varchar);" ) print("created") except Exception as e: print(f"couldn't create table: {str(e)}") conn.commit() cursor.close() conn.close() PYEOF - name: print-message inputs: parameters: - name: message container: image: alpine:latest command: [sh, -c] args: ["echo result was: {{inputs.parameters.message}}"]
优化注意事项
- 优先选择
psycopg2-binary预编译包替代源码版psycopg2,可大幅减少系统编译依赖的安装量,缩短工作流启动耗时 - 该方案每次Pod启动都会重新执行依赖安装步骤,如果工作流运行频率高、对启动速度要求高,还是更推荐提前构建预装所有依赖的自定义镜像
- 原配置使用的
python:alpine3.6版本已停止维护,存在已知安全漏洞,建议替换为3.9及以上版本的稳定Python镜像
内容的提问来源于stack exchange,提问作者Shivam Anand
相关产品推荐
相关产品推荐

