Деплой и инфра
Image layers: тест с выбором ответа
Шесть вопросов поперёк всего юнита. Каждый отражает решение, которое ты принимаешь, когда пишешь или ревьюишь реальный Dockerfile — не определение для заучивания, а компромисс по кэшу и размеру образа, который надо продумать.
Убедись, что связываешь модель кэша-как-префикса, порядок инструкций, multi-stage build, выбор базового образа, гигиену build-контекста и ловушку секрета в неизменяемом слое — тот синтез, к которому вёл урок.
Коллега переносит RUN npm ci прямо перед финальный CMD, рассуждая: 'установка дорогая, значит должна идти последней'. Что на самом деле произойдёт с кэшем при обычной правке исходника?
В Dockerfile эти две строки — отдельные инструкции. Сборки продолжают ставить версии пакетов многомесячной давности даже после обновления upstream-репозитория. Почему? RUN apt-get update RUN apt-get install -y curl
Single-stage Go-сборка отдаёт образ ~180 МБ. Коллега предлагает дописать в конец 'RUN apt-get remove -y build-essential && rm -rf /usr/local/go', чтобы ужать. Образ уменьшится?
Нужен самый маленький, самый закалённый production-образ для самодостаточного скомпилированного сервиса, и шум CVE-сканера должен быть близок к нулю. Какой базовый образ финального stage — senior-выбор по умолчанию, и какую цену ты принимаешь?
В CI сборке нужен токен приватного registry для скачивания зависимостей. Инженер пишет COPY token.txt /tmp/token, использует его в RUN, затем RUN rm /tmp/token в следующей инструкции. Финальный образ опубликован. В чём экспозиция?
docker build медленно даже стартует — несколько секунд проходят до первой инструкции — и COPY . . иногда тащит локальный .env разработчика в образ. В репозитории нет .dockerignore. Какое одно изменение решает оба?
Сквозная линия — одна модель: образ это неизменяемые сложенные слои, кэш — строгий префикс, а RUN кэшируется по тексту команды, а не по эффекту. Упорядочивай от редко- к часто-меняющемуся, чтобы дорогой install оставался кэш-хитом; сливай update-and-install, чтобы они инвалидировались вместе; multi-stage, чтобы компилировать жирно и отгружать тонко вместо удаления байтов, которые никогда не покидают историю; выбирай distroless, когда нужна минимальная attack surface и ты принимаешь потерю shell; и держи build-контекст тонким через .dockerignore. Сложнейшая ловушка — секрет, добавленный и затем rm’нутый — следует из того же правила неизменяемости: его нельзя удалить обратно, поэтому он не должен становиться слоем вообще.