Containerizarea unui proiect Python cu UV

  • 2 minute de citit
  • 2 exemple de cod în Docker

Disponibil și în English

Pe această pagină

Introducere

Salut! 👋

Am vrut să scriu acest scurt articol despre containerizarea unui proiect Python care folosește uv ca manager de proiect. Voi prezenta ce este UV și cum să scriu un Dockerfile pentru un astfel de proiect, pe care îl voi folosi și eu ca referință în viitor.

Ce este UV?

UV este un manager de proiecte și de pachete pentru proiecte Python, și este foarte rapid 🚀!

Viteza lui vine din faptul că este scris în Rust 🦀 de la zero.

Cum diferă de pip

Diferă de pip prin faptul că este mult mai rapid și mult mai eficient. În al doilea rând, pip este doar un manager de pachete, în timp ce uv face mult mai mult și este mai modern.

UV a fost creat pentru a înlocui unelte precum:

  • pip
  • pip-tools
  • pipx
  • poetry
  • pyenv
  • twine
  • virtualenv

Asta înseamnă că uv poate fi folosit pentru a instala diferite versiuni de Python, precum 3.13, 3.12, 3.11, și pentru a crea medii virtuale (venv-uri). De asemenea, atunci când folosiți comanda uv tool (care înlocuiește pipx), poate fi folosit pentru a instala unelte scrise în Python într-un mediu separat de mediul aplicației.

Pentru a executa o unealtă, puteți folosi comanda uv run nume-unealtă și numele uneltei. Eu folosesc de obicei doar următoarele unelte: black, isort și ruff.

Dockerfile

Acesta este Dockerfile-ul meu pe care îl folosesc pentru proiecte:

FROM python:3.12-slim-bookworm# Installer-ul necesită curl (și certificate) pentru a descărca arhiva de releaseRUN apt-get update && apt-get install -y --no-install-recommends curl ca-certificates# Descarcă ultimul installerADD https://astral.sh/uv/install.sh /uv-installer.sh# Rulează installer-ul apoi șterge-lRUN sh /uv-installer.sh && rm /uv-installer.sh# Asigură că binarul instalat se află în `PATH`ENV PATH="/root/.local/bin/:$PATH"# copiază codulWORKDIR /appCOPY pyproject.toml /appRUN uv syncCOPY . .CMD ["uv", "run", "python", "-m", "app.main"]

Motivul pentru care rulez uv sync înainte de COPY . . este să beneficiez de cache-ul pe care îl face builder-ul containerului pentru fiecare layer. Astfel, dacă am o modificare mică în cod și nu modific dependențele din pyproject.toml, build-ul containerului va fi rapid, pentru că toate layer-ele anterioare vor fi luate din cache și doar ultimele două layer-e vor fi folosite pentru build:

COPY . .CMD ["uv", "run", "python", "-m", "app.main"]

Concluzie

În acest articol am explorat cum să containerizăm un proiect Python care folosește UV.

UV se dovedește a fi o alternativă modernă și rapidă la unelte tradiționale precum pip și poetry, oferind funcționalități extinse pentru gestionarea mediilor virtuale și a dependențelor.

Ne vedem data viitoare! 😄