tgoop.com/linuxcamp_tg/361
Create:
Last Update:
Last Update:
Оптимизация Dockerfile и образов
Общие принципы
- Каждая инструкция Dockerfile создаёт слой - по возможности объединяй команды RUN, чтобы минимизировать количество слоёв.
- Не используй latest: фиксируй версии образов и зависимостей для стабильности и воспроизводимости.
- Всегда указывай версии зависимостей:
flask==3.0.0
psycopg2==2.9.9
PyJWT==2.6.0
Правильная структура Dockerfile
FROM python:3.10
WORKDIR /app
# копируем только requirements для кэширования установки
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt && \
rm -rf /root/.cache
# копируем остальной код
COPY . .
CMD ["python", "main.py"]
CMD vs ENTRYPOINT
CMD задаёт команду по умолчанию, которую можно переопределить при запуске контейнера. ENTRYPOINT фиксирует поведение и используется, когда контейнер должен всегда выполнять определённую задачу (например, CLI-инструмент). Обычно их комбинируют: ENTRYPOINT задаёт неизменяемую часть, CMD — параметры по умолчанию.
- CMD — удобно для простого запуска,
- ENTRYPOINT — для CLI-обёрток и скриптов, где логика жёстко зафиксирована.
Советы по чистке
- Используй "--no-cache-dir" при установке pip-зависимостей.
- Удаляй .cache, временные и сборочные файлы (pycache, .pytest_cache и т.д.). А лучше использовать ".dockerignore":
__pycache__/
*.pyc
.git
.venv
.pytest_cache
Оптимизация кэширования
Сначала копируй наименее изменяемые файлы (например, requirements.txt) — это позволяет использовать кэш при сборке.
Многоступенчатая сборка (multi-stage build)
Когда мы собираем Docker-образ, нам часто нужны временные инструменты — компиляторы, менеджеры зависимостей и прочее. Но в финальном образе они уже не нужны и только раздувают размер.
Multi-stage build позволяет:
1) сначала собрать проект во временном образе (build stage),
2) а затем в финальный образ перенести только то, что нужно для запуска (runtime stage),
3) не таща за собой мусор и сборочные инструменты.
Пример для python:
FROM python:3.10 as builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
FROM python:3.10-slim
WORKDIR /app
COPY --from=builder /usr/local/lib/python3.10/site-packages /usr/local/lib/python3.10/site-packages
COPY . .
CMD ["python", "main.py"]
Пример для Go:
FROM golang:1.21 as build
COPY . .
RUN go build ./src/main.go
FROM alpine:latest
COPY --from=build /go/main .
CMD ["./main"]
LinuxCamp | #utils #devops
BY LinuxCamp | DevOps
Share with your friend now:
tgoop.com/linuxcamp_tg/361