Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

DOCKER_IMAGE_BLOAT Linux / DevOps

Multi-stage сборка Dockerfile: уменьшение размера production-образов

Обновлено: 21.08.2026
  • Production-образы весят сотни мегабайт или гигабайты (содержат компиляторы, исходный код и SDK).
  • Высокая длительность скачивания образов в CI/CD пайплайнах (CI pull/push latency).
  • Наличие уязвимостей в пакетах этапа сборки, попавших в production-окружение.

1. Базовый шаблон Multi-stage для компилируемых языков (Golang)

# --- СТАДИЯ 1: Сборка ---
FROM golang:1.22-alpine AS builder
WORKDIR /app
RUN apk add --no-cache git ca-certificates
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -o /app/server .

# --- СТАДИЯ 2: Финальный минимальный образ ---
FROM scratch
WORKDIR /app
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=builder /app/server /app/server
USER 10001:10001
ENTRYPOINT ["/app/server"]

2. Multi-stage для Node.js приложений

# Стадия сборки зависимостей
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

# Финальный контейнер
FROM node:20-alpine
WORKDIR /app
COPY --from=build /app/node_modules ./node_modules
COPY . .
USER node
CMD ["node", "server.js"]

3. Проверка и сравнение слоев

docker build -t my_optimized_app:v1 .
docker history my_optimized_app:v1
💡 Практика специалистов: Для критических сервисов с высокими требованиями к безопасности используйте образы Google Distroless (gcr.io/distroless/static) — они не содержат пакетных менеджеров и командных оболочек (sh/bash), исключая атаки через RCE.

Частые вопросы (FAQ)

Что дает флаг -ldflags='-w -s' при сборке Go в Docker?

Он удаляет отладочные символы DWARF (-w) и таблицу символов (-s), уменьшая размер бинарного файла на 30-50% без потери функциональности.

Зачем копировать go.mod и package.json до копирования остального кода?

Это позволяет эффективно использовать слой кэширования Docker: зависимости перекачиваются только при изменении файлов манифестов, а не при каждой правке исходного кода.

Полезные материалы
Рекомендуем