Иногда docker build тянется вечность, а итоговый образ весит больше, чем база данных 🐘. Разбираемся, как ускорить сборку и оптимизировать размер образа без потери функциональности.
- Используй multistage build
Разделяй стадии сборки и финальный образ. Это особенно важно при компиляции (Go, Java, Node.js):
Стадия 1: билд
FROM golang:1.20 as builder WORKDIR /app
COPY . . RUN go build -o app`
Стадия 2: минимальный runtime
FROM alpine:latest COPY –from=builder /app/app /usr/local/bin/app
`ENTRYPOINT [“app”]
Образ получается меньше 10 МБ!
- Минимизируй base image
Используй alpine, distroless, scratch, если не нужен полноценный дистрибутив:
`FROM python:3.12-slim
Или вообще:
`FROM scratch
- Правильно расставляй
COPYиRUN
Кешируй слои — сначала зависимости, потом исходники:
COPY requirements.txt . RUN pip install -r requirements.txt
`COPY . .
Так pip install не будет повторяться при каждом изменении исходников.
- Убирай мусор и временные файлы
После установки пакетов — чисти кэш:
RUN apt-get update && apt-get install -y ... \ && rm -rf /var/lib/apt/lists/*
- Используй .dockerignore
Иначе в билд попадут node_modules, .git, логи и прочее:
.git node_modules
`*.log
Вывод: Минимизация образа — это не только про размер, но и про безопасность (меньше surface area), скорость CI/CD, стабильность. И не забывай — docker build тоже надо профилировать.
#devops #docker #ci #optimization