Код-ревью 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Тег
latestне закреплён: сборки невоспроизводимы, завтра приедет другой Python. Нужен точный тег, напримерpython:3.12-slim, или digest. - Ошибкастрока 3
apt-get updateв отдельном слое: кеш этого слоя переиспользуется, иinstallпотом работает со старыми списками пакетов. Объединить в одну инструкцию. - Производительностьстрока 4Компиляторы
build-essentialостаются в финальном образе. Ставить без рекомендуемых пакетов (--no-install-recommends), чистить/var/lib/apt/lists/*и выносить сборку в отдельную стадию. - Производительностьстрока 7
rmв отдельном слое не уменьшает образ: архив остаётся в слое строки 5. Скачать, распаковать и удалить в одномRUN. - Производительностьстрока 8
COPY . .до установки зависимостей: любое изменение кода сбрасывает кеш, иpip installвыполняется заново. Сначала копироватьrequirements.txt. - Стильстрока 10Shell-форма 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 ошибок.