Zpět na domů

Optimalizace Python Docker: -43-57% velikosti

Článek rozebírá optimalizaci Docker-obrazů Python: multi-stage sestava snižuje velikost o 43 %, scratch — o 57 %. Příklady Dockerfile, benchmarky, analýza s dive. Vhodné pro middle/senior-vývojáře.

Python Docker: velikost -57% s nuly za multi-stage
Advertisement 728x90

Optimalizace Docker obrazů Python: zmenšení velikosti o 43–57 %

Vícefázová sestavení a slim obrazy Python umožňují zmenšit velikost runtime obrazu z 895 MB na 508 MB (-43 %). Doba sestavení po změnách kódu klesá z 56 na 16 sekund. To urychluje nasazení v Kubernetes, šetří úložiště a přenos dat.

Optimalizace řeší klíčové problémy: rychlé spouštění podů při špičkách zátěže, snížení zpoždění pro uživatele. Závislosti se spravují pomocí Poetry, testy se provádějí ve fázi builder.

.dockerignore a slim obrazy

Vynechte testy a nepotřebné soubory pomocí .dockerignore. Testy jsou potřeba pouze ve fázi sestavení.

Google AdInline article slot

Přejděte na python:3.13-slim-bookworm. Plnohodnotný obraz přidává stovky MB.

Vypněte mezipaměť pip/Poetry pomocí příznaků:

  • pip: --no-cache-dir
  • Poetry: poetry cache clear --all pypi

Vícefázová sestavení: rozbor Dockerfile

Builder fáze nainstaluje Poetry, závislosti a spustí pytest. Runtime fáze zkopíruje pouze site-packages, binární soubory (gunicorn, uvicorn) a kód.

Google AdInline article slot
# Builder fáze
FROM python:3.13-slim-bookworm AS builder
ENV PYTHONUNBUFFERED=1 \
    LANG=C.UTF-8 \
    PYTHONDONTWRITEBYTECODE=1

RUN apt-get update -qq && \
    apt-get install -y --no-install-recommends \
      curl \
      gcc \
      libc-dev \
    && pip install --no-cache-dir 'poetry==2.3.2' \
    && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

WORKDIR /code

COPY pyproject.toml poetry.lock* ./

RUN poetry config virtualenvs.create false \
  && poetry install --no-root --no-dev --no-interaction --no-ansi \
  && poetry cache clear --all pypi --no-interaction || true \
  && rm -rf ~/.cache/pip

COPY . .
RUN pytest

# Runtime fáze
FROM python:3.13-slim-bookworm
ENV PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1 \
    LANG=C.UTF-8

WORKDIR /code

COPY --from=builder /usr/local/lib/python3.13/site-packages /usr/local/lib/python3.13/site-packages
COPY --from=builder /usr/local/bin/gunicorn /usr/local/bin/gunicorn
COPY --from=builder /usr/local/bin/uvicorn /usr/local/bin/uvicorn

COPY --from=builder /code /code

Výsledky základní optimalizace:

| Metrika | Před | Po | Změna |

|---------|------|-------|-----------|

Google AdInline article slot

| Velikost obrazu, MB | 894,84 | 508 | -43 % |

| Doba sestavení od nuly, s | 58 | 315 | +443 % |

| Doba sestavení po úpravách, s | 56 | 16 | -71 % |

První sestavení je pomalejší kvůli builder vrstvám, ale mezipaměť urychluje iterace.

Pokročilé metody: Chainguard a ruční analýza

Chainguard obrazy

Chainguard vylučuje shell, apt/apk, minimalizuje útočnou plochu. Žádné CVE v základních obrazech. Úspora: 50–150 MB.

Nevýhody:

  • Ladění bez shellu
  • Zdarma pouze latest tag
  • Placené — drahé

Hodí se pro high-security projekty.

Ruční analýza s dive

Analyzujte vrstvy:

docker history --format "{{.CreatedBy}}: {{.Size}}" image:tag
docker run -it --rm -v /var/run/docker.sock:/var/run/docker.sock wagoodman/dive:latest image:tag

Zaměřte se na velké vrstvy u runtime. Sbalte adresáře (Shift+Space), odstraňte nepotřebné knihovny. Vyžaduje zkušenosti s Linuxem, vyplatí se zřídka.

Extrémní optimalizace: scratch

Runtime na scratch — zkopírujte pouze potřebné libc. Velikost klesne na 384 MB (-57 % od původního, -24 % od vícefázového).

Nevýhody:

  • Ladění nemožné
  • Nové závislosti vyžadují ruční přidání knihoven
  • Čas na ladění: 1+ hodina

Aktuální pro tisíce podů, Serverless (Knative, Fargate). V Python složitější než v Go.

Porovnání velikostí:

  • Bez vícefázového: 894 → 384 MB (-57 %)
  • Vícefázové: 508 → 384 MB (-24 %)

Optimalizace doby sestavení

Zkopírujte pyproject.toml/poetry.lock PŘED kódem:

  • COPY pyproject.toml poetry.lock* ./
  • RUN poetry install
  • COPY . .
  • RUN pytest

Mezipaměť závislostí se zachová při změnách kódu. Zrychlení: 58 → 14 s (x4).

Co je důležité

  • Vícefázové + slim: -43 % velikosti, -71 % času iterací.
  • .dockerignore + no-cache: vylučuje testy a mezipaměť z runtime.
  • Pořadí COPY: závislosti se ukládají do mezipaměti odděleně od kódu.
  • Scratch: -57 %, ale pro extrémní případy (tisíce podů).
  • Chainguard/dive: pro zabezpečení a jemné ladění.

— Editorial Team

Advertisement 728x90

Číst dál