Файл .dockerignore
.dockerignore — список файлов и папок, которые не отправляются в сборку образа. Он лежит в корне контекста сборки — обычно рядом с Dockerfile — и устроен похоже на .gitignore.
Пример
.git
.env
*.log
**/__pycache__
**/*.pyc
**/node_modules
.venv
Dockerfile
compose.yamlСоздайте файл с таким именем (с точкой в начале) в папке проекта — и при следующей docker build . перечисленное не попадёт ни в сборку, ни в образ.
Зачем он нужен
При docker build . вся папка проекта — контекст сборки — передаётся сборщику. COPY . . кладёт в образ всё, что в ней есть. Без .dockerignore туда попадают:
- секреты —
.envс паролями, ключи, файлы настроек с доступами. Из образа их достанет любой, у кого он есть; - тяжёлые папки —
.git,node_modules, виртуальные окружения Python. Сборка становится медленнее, образ — больше; - мусор и локальное — логи, кэш, собранные на своём компьютере файлы, которые в образе должны собираться заново.
Ещё одна польза — кэш: если в контекст попадает файл, который постоянно меняется (например, лог), COPY . . каждый раз считается изменившимся, и всё после него пересобирается.
Правила шаблонов
- Одна строка — один шаблон. Строка, начинающаяся с
#, — комментарий. - Пути — от корня контекста.
node_modulesисключает папку только в корне;**/node_modules— на любой глубине. *— любые знаки в имени,?— один знак.*.md— файлы.mdв корне, но не в подпапках.**— любое количество папок:**/*.log— все логи во всём проекте.!в начале — исключение из исключения: вернуть файл в сборку.
Пример с ! — исключить все Markdown-файлы, кроме README:
*.md
!README.mdПорядок важен: для каждого файла действует последняя подходящая строка. Строка !README.md до *.md не сработала бы.
Частые ошибки
- Файл назван не так. Нужно ровно
.dockerignore, в корне контекста.dockerignoreбез точки или.dockerignore.txt(так бывает в Windows, если скрыты расширения) не работают. COPYне находит файл. Если файл исключён в.dockerignore, дляCOPYего не существует — сборка упадёт с ошибкойnot found. Проверьте, не попадает ли файл под шаблон.- Шаблон без
**/.__pycache__исключит только папку в корне; кэш в подпапках останется. Для любой глубины пишите**/__pycache__. - Исключили Dockerfile и думаете, что сломали сборку. Это допустимо: Dockerfile и
.dockerignoreвсё равно передаются сборщику, просто их нельзя скопировать в образ черезCOPY.
Свой файл для каждого Dockerfile
Если в проекте несколько Dockerfile, у каждого может быть свой список: рядом с build.Dockerfile кладут build.Dockerfile.dockerignore. Такой файл главнее общего .dockerignore в корне контекста.
.dockerignore защищает сборку, но не заменяет .gitignore: файл .env с паролями нужно исключать в обоих — чтобы он не попал ни в образ, ни в репозиторий.