Для чего в Docker введена послойность образов
Что проверяют
Понимаете ли вы, как устроен образ и почему от порядка инструкций в Dockerfile зависят скорость сборки и размер. Для Python-разработчика следом почти всегда идёт вопрос: как написать Dockerfile, чтобы зависимости не ставились заново при каждой правке кода.
Как отвечать
Образ это стопка слоёв только для чтения. Инструкции RUN, COPY и ADD добавляют слой с изменениями файловой системы, остальные (ENV, CMD, EXPOSE) меняют только метаданные. Слои адресуются по хешу содержимого и склеиваются драйвером хранения, обычно overlay2. Контейнер получает сверху тонкий слой для записи и работает по принципу copy-on-write.
Что это даёт:
- кэш сборки: если инструкция и её входные файлы не изменились, Docker берёт готовый слой. Как только один слой пересобран, все следующие тоже собираются заново;
- общие слои: десять образов на базе
python:3.12-slimхранят базовый слой на диске один раз, аdocker pullиdocker pushпередают только недостающие слои; - быстрый старт: контейнеру не нужно копировать образ целиком.
Для Python из этого следует порядок: сначала COPY requirements.txt . (или pyproject.toml с lock-файлом uv или Poetry), затем установка зависимостей, и только потом COPY . .. Правка кода инвалидирует последний слой, а не установку пакетов. С BuildKit добавьте RUN --mount=type=cache,target=/root/.cache/pip, чтобы кэш pip переживал пересборку. Компиляторы и заголовки для сборки колёс держите в отдельной стадии multi-stage сборки, в финальный образ копируйте только готовое окружение.
Где спотыкаются
Удаляют файлы отдельной командой: RUN apt-get install ..., а ниже RUN rm -rf /var/lib/apt/lists/*. Файлы остаются в предыдущем слое, образ не уменьшается. Чистить нужно в том же RUN.
Пишут COPY . . до pip install. Любая правка в любом файле проекта сбрасывает кэш, и зависимости ставятся заново на каждой сборке.
Кладут секреты в слой через COPY .env или ARG с токеном. Их видно в истории образа даже после удаления, для этого есть RUN --mount=type=secret. Заодно не путайте слои с версиями: откат делают по тегам образов, отдельный слой версией не является.