问题是,当pip install
作为第一步的一部分运行时,它将 python 模块安装到/usr/local
容器内的文件夹中。由于第二步是实例化另一个容器,因此这些模块不可用。这在官方的 Popper 文档中有更详细的解释,其中解释了容器的命名空间和工作流所在的主机之间的关系。
使用官方 python docker 映像并明确处理 virtualenv 可能会有所帮助:
steps:
- id: install-requirements
uses: docker://python:3.8-slim-buster
runs: [bash, -uec]
args:
- |
python -mvenv venv/
source venv/bin/activate
pip install -r requirements.txt
- id: run-sim
uses: docker://python:3.8-slim-buster
runs: [bash, -uec]
args:
- |
source venv/bin/activate
python my_script.py
第一步在popper run
从(文件夹)调用的文件夹上创建一个虚拟环境,并在那里venv/
安装需求。第二个在运行脚本之前加载环境。
您可能想知道如何python:3.8-slim-buster
选择。一般来说,docker hub 上有三种官方镜像,基于 1) full debian, 2) debian-slim 和 3) alpine。我通常使用最新的稳定版 python(截至今天为 3.8),并从 alpine 开始,因为与 debian 映像相比,它的占用空间很小。如果需求使用系统库(例如numpy
),alpine 通常不起作用,因为它没有预编译的二进制文件(轮子),所以我转向基于 debian 的图像的苗条变体