Код-ревью Middle Образы и слои обновлено

Ревью: гигиена образа

Вопрос

Найди проблемы в Dockerfile, связанные со слоями, тегами и размером образа.

FROM python:latest
WORKDIR /app
RUN apt-get update
RUN apt-get install -y build-essential curl
RUN curl -fsSL https://example.com/model.tar.gz -o /tmp/model.tar.gz
RUN tar -xzf /tmp/model.tar.gz -C /opt/model
RUN rm /tmp/model.tar.gz
COPY . .
RUN pip install -r requirements.txt
CMD python app.py

Коротко

Исправленная версия: Тег закреплён, apt выполняется одной инструкцией с очисткой списков, архив не попадает в слой (распаковка из пайпа), зависимости ставятся до копирования кода, CMD в exec-форме. Если для pip install нужны компиляторы, их ставят в отдельной стадии сборки и копируют в финальный образ только результат.

Что должен найти ревьюер

  1. Ошибкастрока 1
    Тег latest не закреплён: сборки невоспроизводимы, завтра приедет другой Python. Нужен точный тег, например python:3.12-slim, или digest.
  2. Ошибкастрока 3
    apt-get update в отдельном слое: кеш этого слоя переиспользуется, и install потом работает со старыми списками пакетов. Объединить в одну инструкцию.
  3. Производительностьстрока 4
    Компиляторы build-essential остаются в финальном образе. Ставить без рекомендуемых пакетов (--no-install-recommends), чистить /var/lib/apt/lists/* и выносить сборку в отдельную стадию.
  4. Производительностьстрока 7
    rm в отдельном слое не уменьшает образ: архив остаётся в слое строки 5. Скачать, распаковать и удалить в одном RUN.
  5. Производительностьстрока 8
    COPY . . до установки зависимостей: любое изменение кода сбрасывает кеш, и pip install выполняется заново. Сначала копировать requirements.txt.
  6. Стильстрока 10
    Shell-форма CMD: процесс запустится через /bin/sh -c, и сигнал SIGTERM получит shell, а не Python. Использовать exec-форму CMD ["python", "app.py"].

Разбор

Исправленная версия:

FROM python:3.12-slim
WORKDIR /app
RUN apt-get update \
 && apt-get install -y --no-install-recommends curl \
 && curl -fsSL https://example.com/model.tar.gz | tar -xz -C /opt/model \
 && rm -rf /var/lib/apt/lists/*
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]

Тег закреплён, apt выполняется одной инструкцией с очисткой списков, архив не попадает в слой (распаковка из пайпа), зависимости ставятся до копирования кода, CMD в exec-форме. Если для pip install нужны компиляторы, их ставят в отдельной стадии сборки и копируют в финальный образ только результат.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.