- Устранена двойная установка зависимостей в Dockerfile - Добавлены ENV переменные для пропуска ненужных бинарников - Создан .dockerignore для ускорения копирования файлов - Обновлены скрипты deploy.sh и update.sh с поддержкой --fast режима - Добавлена документация BUILD_OPTIMIZATION.md и QUICK_FIX.md Ожидаемое время сборки с --fast: 10-15 минут (было 30+ минут)
133 lines
4.4 KiB
Markdown
133 lines
4.4 KiB
Markdown
|
||
# Оптимизация сборки Docker образа
|
||
|
||
## Проблема: Медленная сборка на этапе "Building fresh packages"
|
||
|
||
Сборка может занимать **15-30 минут** из-за компиляции нативных модулей (Prisma, bcryptjs и др.).
|
||
|
||
## Внесенные оптимизации
|
||
|
||
### 1. Устранена двойная установка зависимостей
|
||
**Было:**
|
||
```dockerfile
|
||
RUN yarn install --production --frozen-lockfile
|
||
RUN yarn install --frozen-lockfile
|
||
```
|
||
|
||
**Стало:**
|
||
```dockerfile
|
||
RUN yarn install --immutable --network-timeout 600000
|
||
```
|
||
|
||
### 2. Добавлены переменные окружения для ускорения
|
||
```dockerfile
|
||
ENV SKIP_SASS_BINARY_DOWNLOAD_FOR_CI=true
|
||
ENV SKIP_NODE_SASS_TESTS=true
|
||
ENV CYPRESS_INSTALL_BINARY=0
|
||
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
|
||
```
|
||
|
||
### 3. Создан .dockerignore
|
||
Исключены ненужные файлы из контекста сборки (логи, кеш, документация и т.д.).
|
||
|
||
## Рекомендации при развертывании
|
||
|
||
### Если сборка все еще медленная:
|
||
|
||
#### Вариант 1: Увеличьте ресурсы Docker
|
||
```bash
|
||
# Проверьте текущие лимиты
|
||
docker info | grep -i "CPUs\|Memory"
|
||
|
||
# Для Docker Desktop: Settings → Resources
|
||
# CPU: минимум 2 ядра, рекомендуется 4
|
||
# RAM: минимум 4GB, рекомендуется 8GB
|
||
```
|
||
|
||
#### Вариант 2: Используйте готовый образ (рекомендуется)
|
||
Соберите образ один раз на мощной машине и загрузите в реестр:
|
||
|
||
```bash
|
||
# На мощной машине
|
||
docker build -t global-it24:latest .
|
||
docker save global-it24:latest | gzip > global-it24-image.tar.gz
|
||
|
||
# Перенесите файл на сервер и загрузите
|
||
docker load < global-it24-image.tar.gz
|
||
```
|
||
|
||
#### Вариант 3: Используйте BuildKit с кешированием
|
||
```bash
|
||
# Включите BuildKit
|
||
export DOCKER_BUILDKIT=1
|
||
|
||
# Соберите с кешем
|
||
docker build --build-arg BUILDKIT_INLINE_CACHE=1 -t global-it24:latest .
|
||
```
|
||
|
||
#### Вариант 4: Установите более быстрый линкер (на хосте)
|
||
```bash
|
||
# Для Ubuntu/Debian
|
||
sudo apt-get install -y mold
|
||
|
||
# Добавьте в Dockerfile перед RUN yarn install
|
||
ENV CC=clang
|
||
ENV CXX=clang++
|
||
ENV LD=mold
|
||
```
|
||
|
||
## Мониторинг прогресса сборки
|
||
|
||
```bash
|
||
# В отдельном терминале следите за процессом
|
||
docker ps -a | grep build
|
||
docker stats
|
||
|
||
# Проверьте логи подробнее
|
||
docker build --progress=plain -t global-it24:latest .
|
||
```
|
||
|
||
## Типичное время сборки
|
||
|
||
| Конфигурация | Время |
|
||
|-------------|-------|
|
||
| 2 CPU, 4GB RAM | 20-30 минут |
|
||
| 4 CPU, 8GB RAM | 10-15 минут |
|
||
| 8 CPU, 16GB RAM | 5-8 минут |
|
||
| С кешем BuildKit | 2-5 минут |
|
||
|
||
## Нормальное поведение
|
||
|
||
✅ **Это нормально:**
|
||
- Предупреждения о peer dependencies (они не влияют на работу)
|
||
- Долгая компиляция на этапе "Building fresh packages" (10-20 минут)
|
||
- Множество предупреждений от Prisma и других пакетов
|
||
|
||
❌ **Это проблема:**
|
||
- Сборка зависла более 45 минут без прогресса
|
||
- Ошибки (errors), а не предупреждения (warnings)
|
||
- Выход с кодом ошибки
|
||
|
||
## Если сборка зависла намертво
|
||
|
||
```bash
|
||
# Остановите сборку
|
||
Ctrl+C
|
||
|
||
# Очистите все промежуточные контейнеры и кеш
|
||
docker builder prune -a -f
|
||
|
||
# Попробуйте снова с --no-cache
|
||
docker build --no-cache -t global-it24:latest .
|
||
```
|
||
|
||
## Альтернатива: Многоступенчатая сборка на CI/CD
|
||
|
||
Если у вас есть GitHub Actions, GitLab CI или Jenkins:
|
||
|
||
1. Соберите образ на CI/CD сервере (обычно там больше ресурсов)
|
||
2. Загрузите в Docker Registry (Docker Hub, GitHub Registry, GitLab Registry)
|
||
3. На продакшн-сервере просто выполните `docker pull`
|
||
|
||
Это самый быстрый и надежный способ для production.
|