Я привык использовать pip
для установки пакетов Python в виртуальные среды проектов Django.
Когда я работаю с проектом Divio Docker локально, это не сработает.
Есть две вещи, о которых вам нужно знать при установке пакетов Python в проект Docker:
В приведенных ниже подробностях описывается использование проекта Divio, но принцип будет аналогичным для других установок Docker.
Чтобы использовать pip
в командной строке для установки пакета Python в проект Dockerised, вам нужно использовать pip
внутри среды Docker, то есть внутри контейнера.
Недостаточно быть в каталоге, где у вас есть доступ к файлам проекта. В этом отношении он похож на использование виртуальной среды - вам нужно активировать virtualenv. (В противном случае ваш пакет будет установлен не в виртуальной среде, а в собственной среде хоста).
Чтобы активировать виртуальную среду, вы должны запустить что-то вроде source bin/activate
на нем.
Чтобы установить пакет в web
контейнер Divio:
# start a bash prompt inside the project
docker-compose run --rm web bash
# install the package in the usual way
pip install rsa
rsa
теперь установлена и доступна для использования.
Однако, однако, пакет будет установлен и доступен только в этом конкретном контейнере. Как только вы выйдете из оболочки bash, контейнер исчезнет. В следующий раз, когда вы запустите web
контейнер, вы не найдете там пакет rsa
. Это потому, что контейнер запускается каждый раз из его изображения.
Чтобы пакет оставался установленным, вам нужно будет включить его в изображение.
Проект Divio включает файл requirements.in
перечислением пакетов Python, которые будут включены в образ.
Добавьте новую строку, содержащую rsa
в конец этого файла. Затем выполните:
docker-compose build web
Это приведет к восстановлению изображения Docker. В следующий раз, когда вы запустите контейнер с (например) с помощью docker-compose run --rm web bash
, он будет включать этот пакет Python.
(В Руководстве разработчика Divio есть дополнительные рекомендации по использованию pip.)
Примечание. Я являюсь членом команды Divio. Этот вопрос тот, который мы видим довольно регулярно через наши каналы поддержки.