Почему люди создают virtualenv в контейнере докеров?

Вы можете создать контейнер с Dockerfile за несколько секунд, а затем, почему люди должны установить виртуальную среду внутри контейнера докеров?

Это как виртуальная машина на виртуальной машине?

Ответ 1

Я работаю с virtualenvs в Docker, и я думаю, что есть несколько причин:

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

Я думаю, что это все разумные причины добавить немного pip install virtualenv в конце установки!:)

Ответ 2

Вот мои два цента, или, скорее, комментарии к ответу @gru и некоторые комментарии.

  • Ни докеры, ни виртуальные среды не являются виртуальными машинами
  • каждая строка в файле докеры создает накладные расходы. Но это правда, что во время работы виртуальные среды имеют нулевой эффект
  • идея контейнеров-докеров заключается в том, что у вас есть один процесс, который взаимодействует с другими (docker-) службами в отношениях клиент-сервер. Запуск различных приложений в одной докере или вызов одного приложения из другого внутри докера - это как-то против этой идеи. Что еще более важно, это добавляет сложности вам докер, которого вы хотите избежать.
  • "выделение" пакетов python, которые приложение видит (внутри виртуальной среды) из пакетов, установленных в докере, необходимо только в том случае, если вам необходимо обеспечить определенную версию для одного или нескольких пакетов.
  • система, установленная внутри контейнера, служит только средой для одного приложения, которое вы используете. Откорректируйте его в соответствии с требованиями вашего приложения. Нет необходимости оставлять его "нетронутым",

Итак, в заключение: нет веских оснований для использования виртуальной среды внутри контейнера. Установите все необходимые пакеты в системе. Если вам нужен контроль над точными версиями пакетов, установите (docker- широкий) с помощью pip или аналогичного.

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