Советы, как управлять модулями Python в Docker? - PullRequest
0 голосов
/ 17 декабря 2018

Я после совета о том, как управлять модулями Python в контексте Docker.

Текущие опции, которые мне известны, включают:

  1. Установка их по отдельности через pip в процессе сборки
  2. Установка их вместе через pip в процессе сборки черезrequirments.txt
  3. Установка их на том и добавление тома в PYTHONPATH

В идеале мне нужно решение, которое полностью воспроизводимо и не требует, чтобы каждый модульбыть переустановленным, если я решу добавить другой модуль или обновить версию одного из них.

С моей точки зрения:
(2) является проблемой, потому что команда docker ADD (чтобы получить доступ к файлу requirements.txt), по-видимому, делает кэш недействительным и означает, что любые изменения в файле означаютвсе необходимо перестраивать / переустанавливать каждый раз, когда вы создаете образ.
(1) сохраняет кэш-память нетронутым, но означает, что вам нужно будет указать точную версию для каждого пакета (и, возможно, их зависимости?), что выглядиткак это может быть довольно утомительно и подвержено ошибкам.
(3) в настоящее время является моим личным фаворитом, так как позволяет пакетам сохраняться между образами / сборками и позволяет использовать requirements.txt.Единственным недостатком является то, что по сути вы храните пакеты на своем локальном компьютере, а не образ, что приводит к зависимости контейнера от операционной системы хоста, что в некоторой степени побеждает точку контейнера.

Так что яЯ не совсем уверен, какие здесь лучшие практики, и буду признателен за советы.

Для справки: есть другие вопросы по этой теме, но я не думаю, что кто-то из них правильно ответил на мой вопрос:
Докер с модифицированными модулями Python?
Docker составляет требования к установке. Txt
Как я могу установить модули Python в образ докера?

РЕДАКТИРОВАТЬ:
Просто некоторые дополнительные примечания, чтобы дать больше информацииконтекст.Мои проекты обычно ориентированы на анализ данных (а не на разработку программного обеспечения или веб-разработку).Я склонен использовать несколько изображений (1 для python, 1 для R, 1 для базы данных), используя docker compose для управления ими всеми вместе.До сих пор я использовал make-файл на хост-ОС для пересоздания проекта с нуля, то есть что-то вроде

some_output.pdf:  some_input.py
    docker-compose run python_container python some_input.py

, где выходные данные записываются в том на хост-ОС

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Другим вариантом является использование функции многоступенчатой ​​сборки .Создайте промежуточную сборку, которая устанавливает зависимости, а затем просто скопируйте папку в рабочий образ (второй этап сборки).Это также дает вам преимущество вашего варианта 3.

Это зависит от того, какой шаг в вашей сборке более дорогой и выиграет от кэширования.Сравните следующее:

Dockerfile A

ИЗ Ubuntu: 16.04

Установка Python, Pip и т. Д. Добавить файл require.txt Запустить установку pip

Запустить сборкушаги, которые стоят дорого.

Dockerfile B

ИЗ Ubuntu: 16.04 AS промежуточный Установить Python, Pip и т. д. Добавить файл require.txt Запустить pip install

ИЗ Ubuntu: 16.04

Запустите мои этапы сборки, которые стоят дорого.

COPY --from = промежуточные / pip-пакеты / / pip-packages /

В первом случае прикосновение к вашему Requirements.txt будетзаставить полную сборку.Во втором случае ваши дорогостоящие этапы сборки все еще кэшируются.Промежуточная сборка все еще выполняется, но я предполагаю, что это не дорогой шаг.

0 голосов
/ 17 декабря 2018

Файл requirements.txt - лучший вариант.(Даже при его изменении выполняется полная переустановка.)

Новый разработчик запускается в вашем проекте.Они проверяют ваш репозиторий системы контроля версий и говорят: «О, это проект Python!», Создают виртуальную среду и запускают pip install -r requirements.txt, и они готовы к работе.Неделю спустя они приходят и говорят: «Так как же мы это развернем?», Но, поскольку вы завершили обычную настройку Python в Docker, им не нужно изо всех сил использовать странный процесс разработки, специфичный для Docker..

Бедствие!Жесткий диск вашего основного сервера вышел из строя!У вас есть резервные копии всех ваших данных , но код приложения просто восстанавливается из системы контроля версий.Если вы храните код в томе Docker (или в директории хоста, смонтированной с привязкой), вам необходимо выяснить, как его перестроить;но ваши первые два варианта записаны в Dockerfile.Это также важно для нового разработчика в предыдущем абзаце (который хочет проверить свой образ локально перед его развертыванием) и для любой системы кластерного развертывания (Swarm, Kubernetes), где вы хотите просто развернуть образ, а нетакже необходимо развернуть код рядом с ним вручную вне каркаса системы развертывания.

...