Как ограничить копируемые файлы при использовании инструкции COPY в Dockerfile?

Ответ

Ограничить файлы, попадающие в образ через 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> ты можешь вытащить из предыдущей стадии только готовый артефакт — скажем, скомпилированный бинарник. И в финальный образ попадёт только он, а не овердохуища мусора вроде компиляторов и исходников. Финальный образ получается лёгким и ахуенно оптимизированным.