Перенести virtualenv в образ докера

Можно ли передать данные виртуальной среды с локального хоста в образ докера с помощью команды ADD?

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

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

Просто кажется очень неэффективным выполнение pip install через файл requirements.txt, который был передан в контейнер, в отличие от того, чтобы делать все это локально, иначе каждый раз, когда образ запускается, он должен переустанавливать те же зависимости, которые не изменились с сборка каждого изображения.

Я думаю, вы неправильно понимаете, как работают сборки Docker - они не происходят во время запуска контейнера.

Oliver Charlesworth 14.03.2018 21:54
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
6
1
3 479
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Хотя это возможно, это не рекомендуется.

  • Зависимости (версии библиотеки, глобально установленные пакеты) могут быть разными на хост-машине и в контейнере.
  • Сборки образов не будут воспроизводиться на 100% на других хостах.
  • Влияние установки pip невелико. Каждая команда RUN создает свой собственный уровень, который кэшируется локально, а также в репозитории, поэтому установка pip будет повторно запущена только при изменении файла requirements.txt (или перестройки предыдущих слоев).

Чтобы запускать установку pip только при изменении файла requirements.txt, Dockerfile должен запускаться следующим образом:

... COPY requirements.txt ./ RUN pip install -r requirements.txt COPY src/ ./ ...

Кроме того, он будет запускаться только при сборке образа, а не при запуске контейнера.

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

Однако, ради отладки, есть ли альтернатива созданию и запуску новых образов, когда что-то изменилось? В моем текущем рабочем процессе были внесены правки в docker -> docker build -> docker run. Создание новых образов каждый раз, что, очевидно, является плохой практикой и занимает несколько часов, когда для каждой сборки устанавливаются 15 различных файлов requirements.txt.

Baily 14.03.2018 22:03

Для отладки вы можете присоединиться к своему контейнеру с помощью docker exec -it <container> /bin/bash и вносить правки, возможно, используя том для источников. Если у вас есть несколько контейнеров с одинаковыми зависимостями, вы можете создать промежуточный образ со всеми зависимостями и собрать другие образы FROM на нем.

Dmitry Platonov 14.03.2018 22:19
Ответ принят как подходящий

Мы столкнулись с этой проблемой ранее, и вот несколько вещей, которые мы рассмотрели:

  1. Рассмотрите возможность создания базовых образов с установленными общими пакетами. Затем контейнеры приложений могут использовать один из этих базовых контейнеров и установить дифференциал.
  2. Кэшировать пакеты Pip на локальном пути, который может быть установлен на контейнере. Это сэкономит время на загрузку пакетов.

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

Другие вопросы по теме