На Reddit было краткое обсуждение сред развертывания на Python, которое началось с комментария, в котором спрашивалось, когда использовать контейнеры Docker, а не virtualenv. Я хотел бы продолжить обсуждение, поделившись своими мыслями по этому поводу.

Если вы используете docker-контейнер для развертывания приложений Python, вам, вероятно, не нужно помещать virtualenv внутри контейнера.

Почему? Подумай об этом. Если вы посмотрите документацию по virtualenv:

virtualenv - это инструмент для создания изолированных сред Python.

Virtualenv создает изолированные среды Python для установки приложений Python и их зависимостей, предотвращая такие вещи, как конфликты зависимостей и тому подобное.

А что с докером? Из Документации:

Образ контейнера - это легкий автономный исполняемый пакет программного обеспечения, который включает в себя все необходимое для его запуска: код, среду выполнения, системные инструменты, системные библиотеки, настройки.

Docker создает полную среду для запуска приложения (включая его зависимости, системные библиотеки, ОС и т. Д.), Что делает его исполняемым на любом компьютере со средой выполнения докера. Если вы посмотрите на оба решения, с точки зрения Python, docker также решает ту же проблему, для решения которой был создан virtualenv.

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

Что делать, если мне нужно запустить что-то вместе с приложением?

Что ж, это инструмент, который подготавливает среду для приложения? Если да, то это, вероятно, должно быть шагом к созданию вашего имиджа. Если это серверное приложение, поместите его в отдельный контейнер.

Вам когда-нибудь понадобятся оба?

Может быть. Есть вероятность, что могут потребоваться оба решения. Означает ли это, что вы должны использовать и то, и другое с самого начала, чтобы уменьшить эту вероятность, когда она появится? Возможно нет. Нет никакой пользы от добавления сложности сейчас, если что-то случится, особенно когда вероятность этого мала.

Дело в том, что я считаю, что YAGNI распространяется также и на область DevOps / Sysadmin. Используйте любые инструменты, необходимые для выполнения работы… и только это. В производственной среде достаточно всего лишь плохого пути, чтобы навлечь на себя ад. Уменьшение количества вещей, которыми нужно управлять, также снижает шансы облажаться.

Вот и все.