невозможно использовать модули Python на отдельных этапах рабочего процесса popper
У меня есть 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
step работает, в нем нет модулей, которые были установлены на первом шаге.
1 ответ
Проблема в том, что когда pip install
запускается как часть первого шага, он устанавливает модули python в /usr/local
папка внутри контейнера. Поскольку на втором этапе создается экземпляр другого контейнера, эти модули недоступны. Более подробно это объясняется в официальной документации Popper, где объясняются отношения между пространствами имен контейнера и хост-машиной, на которой находится рабочий процесс.
Использование официального образа докера python и явная работа с 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
вызывается из (a venv/
папку) и устанавливает туда требования. Второй загружает среду перед запуском скрипта.
Вам может быть интересно, как python:3.8-slim-buster
был выбран. Как правило, в docker hub есть три типа официальных образов: на основе 1) полного debian, 2) debian-slim и 3) alpine. Обычно я использую последний стабильный выпуск python (на сегодняшний день 3.8) и начинаю с alpine, потому что он занимает мало места по сравнению с образами debian. Если требования используют системные библиотеки (например,numpy
), alpine обычно не работает, потому что для него нет предварительно скомпилированных двоичных файлов (колес), поэтому я перехожу к тонкому варианту образов на основе debian