Можно ли устанавливать зависимости внутри Docker-контейнера?

«Можно ли устанавливать зависимости внутри Docker-контейнера?» — вопрос из категории DevOps, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, установка зависимостей внутри контейнера — это стандартная и рекомендуемая практика. Она обеспечивает изоляцию среды, воспроизводимость сборки и независимость от хостовой системы.

Правильный подход через Dockerfile:

FROM python:3.9-slim

# Копируем файл зависимостей отдельно для кэширования слоя
COPY requirements.txt /tmp/
RUN pip install --no-cache-dir -r /tmp/requirements.txt

# Затем копируем остальной код приложения
COPY . /app
WORKDIR /app

Ключевые принципы:

  1. Фиксация версий: В requirements.txt должны быть зафиксированы конкретные версии пакетов (например, Django==4.2.0).
  2. Кэширование слоев: Отдельное копирование requirements.txt и выполнение RUN pip install до копирования всего кода позволяет Docker кэшировать слой с зависимостями. Это значительно ускоряет последующие сборки, если зависимости не менялись.
  3. Многоэтапная сборка (Multi-stage): Для production-образов используйте multi-stage builds, чтобы уменьшить итоговый размер образа, оставив в финальном образе только необходимые артефакты и зависимости времени выполнения.

Пример requirements.txt для воспроизводимости:

Django==4.2.0
djangorestframework==3.14.0
psycopg2-binary==2.9.6