Ответ
Ограничить файлы, попадающие в образ через COPY, можно двумя основными способами: с помощью файла .dockerignore и за счет точного указания исходных путей.
1. Использование .dockerignore
Создайте файл .dockerignore в корне контекста сборки (рядом с Dockerfile). В нём укажите шаблоны файлов и директорий, которые должны быть исключены.
# Игнорировать ненужные для runtime файлы
.git
.gitignore
*.log
*.tmp
# Игнорировать зависимости и артефакты сборки
node_modules/
target/
dist/
# Игнорировать конфигурации для разработки
.env.local
docker-compose.override.yml
Это ускоряет сборку, уменьшая размер контекста, передаваемого Docker daemon.
2. Точное указание исходных путей в COPY
Вместо копирования всей директории (COPY . /app) явно укажите только необходимые файлы.
# Копируем только файлы, необходимые для установки зависимостей
COPY package.json package-lock.json /app/
# Копируем только исходный код, исключая тесты и документацию
COPY src/ /app/src/
COPY config/production.yaml /app/config/
Практический совет: В мультистадийных сборках используйте COPY --from=<stage> для копирования только итоговых артефактов (например, скомпилированного бинарника) из предыдущей стадии, что минимизирует размер финального образа.
Ответ 18+ 🔞
Да ты посмотри, какая простая, казалось бы, штука, а сколько подводных камней! Ну, типа, чтобы в твой образ не натащилось всякого мусора, есть два основных пути, и оба — твои лучшие друзья.
Первый — это .dockerignore, ёпта.
Создаёшь в корне, рядом с докерфайлом, этот самый файлик. И пишешь туда всё, что тебе в образе нахуй не сдалось. Это как сказать демону: «Слушай, брат, вот эту хрень даже не рассматривай».
# Игнорируем всё, что связано с гитом и временщиной
.git
.gitignore
*.log
*.tmp
# Игнорируем зависимости и артефакты сборки — они в образе свои будут
node_modules/
target/
dist/
# Игнорируем конфиги для разработки, чтобы случайно не залить пароли
.env.local
docker-compose.override.yml
В чём профит? А в том, что контекст сборки становится меньше, демон не ебёт мозг лишними гигабайтами, и образ собирается быстрее. Просто красота, ядрёна вошь!
Второй способ — не быть распиздяем в команде COPY.
Вместо того чтобы тупо скопировать всю директорию (COPY . /app), можно указать только то, что реально нужно. Точность — вежливость королей и хороших девопсов.
# Копируем только файлы, нужные для установки зависимостей
COPY package.json package-lock.json /app/
# Копируем исходники, но не тащим тесты и прочую документацию
COPY src/ /app/src/
COPY config/production.yaml /app/config/
А вот практический совет, который тебя реально выручит. Если используешь мультистадийную сборку, то там вообще магия. Командой COPY --from=<stage> ты можешь вытащить из предыдущей стадии только готовый артефакт — скажем, скомпилированный бинарник. И в финальный образ попадёт только он, а не овердохуища мусора вроде компиляторов и исходников. Финальный образ получается лёгким и ахуенно оптимизированным.