← Назад к вопросам

Как будешь докеризировать большой проект с исключением одной директории?

1.8 Middle🔥 202 комментариев
#Инфраструктура и DevOps

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Докеризация большого проекта с исключением директории

Для докеризации большого проекта с исключением определенной директории существует несколько подходов, которые я применяю в зависимости от контекста и требований проекта.

Основные подходы к исключению директорий

1. Использование .dockerignore файла

Наиболее распространенный и правильный способ — создание файла .dockerignore в корне проекта. Этот файл работает аналогично .gitignore и позволяет исключить файлы и директории из контекста сборки Docker.

# .dockerignore
node_modules/
.git/
.vscode/
logs/
tmp/

# Исключаем конкретную директорию
исключаемая_директория/

# Можно использовать шаблоны
*.log
*.tmp
**/*.cache

# Но включаем необходимые поддиректории
!исключаемая_директория/нужный_файл.txt

Преимущества:

  • Уменьшает размер контекста сборки
  • Ускоряет процесс сборки образа
  • Улучшает безопасность (исключаются чувствительные файлы)

2. Многоступенчатая сборка (Multi-stage builds)

Для сложных проектов часто использую многоступенчатые сборки, где исключение директорий происходит на разных этапах:

# Первая стадия - сборка
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Вторая стадия - production
FROM node:18-alpine AS production
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/package*.json ./
RUN npm ci --only=production

# Копируем только нужные файлы, исключая ненужные директории
COPY --from=builder /app/src ./src
# Директория исключается автоматически, так как не копируется

3. Динамическое управление копированием

В некоторых случаях требуется более тонкий контроль:

FROM php:8.2-fpm

WORKDIR /var/www/html

# Копируем только необходимые файлы
COPY composer.json composer.lock ./
COPY app/ ./app/
COPY config/ ./config/
COPY public/ ./public/
COPY resources/ ./resources/
COPY routes/ ./routes/
COPY database/ ./database/

# Исключаем директорию tests, не копируя ее
# Директория storage будет создана позже
RUN mkdir -p storage

# Устанавливаем зависимости
RUN composer install --no-dev --optimize-autoloader

# Настраиваем права
RUN chown -R www-data:www-data storage bootstrap/cache

Практические рекомендации

Структура .dockerignore для большого проекта:

# Системные файлы
.git/
.gitignore
.gitattributes
.DS_Store
.idea/
.vscode/
*.swp
*.swo

# Логи и временные файлы
*.log
logs/
tmp/
temp/

# Зависимости (если устанавливаются внутри контейнера)
node_modules/
vendor/
composer.lock

# Сборки и артефакты
dist/
build/
.coverage/
.nyc_output/

# Конфигурации сред
.env.*
!.env.example

# Документация
docs/
coverage/

# Тесты
tests/
spec/
features/

# Исключаемая директория
исключаемая_директория/

Обработка особых случаев:

  1. Исключение с включением поддиректорий:

    # Исключаем всю директорию, кроме специфичных файлов
    logs/*
    !logs/nginx/
    
  2. Исключение по маске:

    # Исключаем все файлы с расширением .map
    **/*.map
    
    # Исключаем кэш-файлы
    **/__pycache__/
    **/*.pyc
    

Архитектурные соображения

Для больших проектов рекомендую:

  1. Разделение на микросервисы — если директория представляет собой отдельный функциональный блок
  2. Volume mounts для разработки — исключенные директории могут монтироваться как volumes
  3. Слоистая структура образа — часто изменяемые файлы в верхних слоях

Пример полной конфигурации:

# Dockerfile
FROM php:8.2-fpm-alpine

# Устанавливаем системные зависимости
RUN apk add --no-cache \
    nginx \
    supervisor \
    && docker-php-ext-install pdo pdo_mysql

# Настраиваем рабочую директорию
WORKDIR /var/www

# Копируем только необходимые файлы
COPY --chown=www-data:www-data composer.json composer.lock ./
COPY --chown=www-data:www-data app/ ./app/
COPY --chown=www-data:www-data config/ ./config/
COPY --chown=www-data:www-data public/ ./public/
COPY --chown=www-data:www-data resources/ ./resources/

# Исключение происходит через .dockerignore
# tests/ - исключена
# node_modules/ - исключена

# Устанавливаем зависимости
RUN composer install --no-dev --no-scripts --optimize-autoloader

# Копируем конфигурации
COPY docker/nginx.conf /etc/nginx/nginx.conf
COPY docker/supervisord.conf /etc/supervisord.conf

EXPOSE 80

CMD ["supervisord", "-c", "/etc/supervisord.conf"]

Важные замечания:

  1. .dockerignore должен быть в корне контекста сборки
  2. Изменения в .dockerignore не инвалидируют кэш Docker
  3. Для проверки можно использовать docker build --no-cache
  4. В production образах следует минимизировать количество слоев

Правильное исключение директорий не только оптимизирует размер образа, но и улучшает безопасность, исключая потенциально чувствительные файлы из финального контейнера. Для больших проектов это критически важно для эффективности CI/CD процессов.

Как будешь докеризировать большой проект с исключением одной директории? | PrepBro