Иногда docker build тянется вечность, а итоговый образ весит больше, чем база данных 🐘. Разбираемся, как ускорить сборку и оптимизировать размер образа без потери функциональности.

  1. Используй 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 МБ!

  1. Минимизируй base image
    Используй alpine, distroless, scratch, если не нужен полноценный дистрибутив:

`FROM python:3.12-slim

Или вообще:

`FROM scratch

  1. Правильно расставляй COPY и RUN
    Кешируй слои — сначала зависимости, потом исходники:

COPY requirements.txt . RUN pip install -r requirements.txt `COPY . .

Так pip install не будет повторяться при каждом изменении исходников.

  1. Убирай мусор и временные файлы
    После установки пакетов — чисти кэш:

RUN apt-get update && apt-get install -y ... \ && rm -rf /var/lib/apt/lists/*

  1. Используй .dockerignore
    Иначе в билд попадут node_modules, .git, логи и прочее:

.git node_modules `*.log

Вывод: Минимизация образа — это не только про размер, но и про безопасность (меньше surface area), скорость CI/CD, стабильность. И не забывай — docker build тоже надо профилировать.

#devops #docker #ci #optimization

Авторские права

Автор: Vasiliy Fakunin

Ссылка: https://notes.melancholic.tech/posts/%D0%BA%D0%B0%D0%BA-%D1%83%D1%81%D0%BA%D0%BE%D1%80%D0%B8%D1%82%D1%8C-docker-build-%D0%B8-%D1%81%D0%BE%D0%BA%D1%80%D0%B0%D1%82%D0%B8%D1%82%D1%8C-%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80-%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%B0/

Лицензия: CC BY-NC-SA 4.0

Использование материалов блога разрешается при условии: указания авторства/источника, некоммерческого использования и сохранения лицензии.

Начать поиск

Введите ключевые слова для поиска статей

↑↓
ESC
⌘K Горячая клавиша