Кожна інструкція Dockerfile (RUN, COPY, ADD...) створює шар. Під час повторного збирання Docker перевіряє, чи змінилася інструкція та файли, що в неї входять. Якщо ні - бере шар з кешу. Щойно один шар змінився, усі наступні збираються заново.
Погано:
COPY . /var/www
RUN composer install --no-dev
Будь-яка зміна в коді (навіть README) інвалідує COPY ., і composer install виконується щоразу - хвилини на кожне збирання.
Добре: спершу те, що змінюється рідко, потім - часто:
COPY composer.json composer.lock /var/www/
RUN composer install --no-dev --no-scripts --no-autoloader
COPY . /var/www
RUN composer dump-autoload --optimize
Тепер залежності перевстановлюються лише при зміні composer.json/composer.lock, а зміна коду перебудовує тільки останні шари.
Ще правила:
.dockerignore- щоб у контекст збирання не потраплялиvendor/,node_modules/,.git/,.env, логи. ІнакшеCOPY .інвалідується через файли, що до застосунку не мають стосунку, а секрети можуть потрапити в образ.- Встановлення пакетів ОС - на початку, одним
RUN, разом з очищенням кешу менеджера пакетів. - Кеш-монтування BuildKit зберігає кеш Composer чи npm між збираннями навіть після інвалідації шару:
RUN --mount=type=cache,target=/root/.composer/cache composer install
- У CI кеш зникає з кожною новою машиною - його експортують у реєстр (
--cache-to/--cache-from).