Контекст збирання - набір файлів, які Docker передає збирачу. У команді docker build . крапка - це контекст: поточний каталог з усім вмістом. Інструкції COPY і ADD бачать лише файли з контексту.
Проблема без .dockerignore: у контекст потрапляє все - vendor, node_modules, .git, логи, локальна база SQLite, .env:
- повільне збирання - сотні мегабайтів передаються збирачу щоразу;
- ламається кеш:
COPY . .вважає зміненими будь-які файли, включно з логами й.git, - шар і всі наступні збираються заново; - витік секретів:
.envз паролями чи ключі можуть опинитися в образі й потрапити в реєстр; - неправильні залежності: локальний
vendor(зібраний під macOS, з dev-пакетами) перезаписує той, що встановлено в образі.
.dockerignore для Laravel-проєкту:
.git
.github
.env
.env.*
!.env.example
node_modules
vendor
public/build
public/hot
storage/logs/*
storage/framework/cache/*
storage/framework/sessions/*
storage/framework/views/*
bootstrap/cache/*.php
tests
*.log
docker-compose*.yml
Синтаксис схожий на .gitignore: шаблони, ** для будь-якої глибини, ! - виняток з виключення.
Чому краще виключати, ніж копіювати вибірково: навіть з точними COPY (COPY app/ app/) контекст усе одно передається збирачу повністю - .dockerignore зменшує саму передачу.
Як перевірити розмір контексту: BuildKit показує його у виводі збирання (transferring context: 2.3MB). Сотні мегабайтів - сигнал, що щось не виключено.
Нюанси:
.dockerignoreшукається в корені контексту (або поруч з Dockerfile у виглядіDockerfile.dockerignoreдля кількох Dockerfile в одному репозиторії);vendorіnode_modulesвстановлюються всередині збирання (composer install,npm ci) - тоді вони збираються під Linux образу й лише з потрібними залежностями;- виключені файли недоступні навіть для
COPY- якщо файл потрібен у збиранні, його не можна виключати.