无法在 popper 工作流程的单独步骤中使用 python 模块

unable to use python modules in separate steps in a popper workflow

我有一个 requirements.txt 文件,我在执行以下工作流程时会用到它:

steps:
  - id: install-python-modules
    uses: popperized/python-actions@master
    args:
    - pip install -r requirements.txt

  - id: run-script
    uses: popperized/python-actions@master
    args:
    - python my_script.py

我遇到的问题是,当 run-script 步骤运行时,它没有在第一步中安装的模块。

问题是,当 pip install 作为第一步的一部分运行时,它会将 python 模块安装到容器内的 /usr/local 文件夹中。由于第二步是实例化另一个容器,因此这些模块不可用。这在 official Popper documentation 中有更详细的解释,其中解释了容器的名称空间与工作流所在的主机之间的关系。

使用官方 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 通常不起作用,因为没有预编译的二进制文件(wheels),所以我转向基于 debian 图像的 slim 变体