Доцкер за Питхон у 2026: Модерни ув + водич за вишестепену изградњу
Отворите било који петогодишњи водич „Доцкеризе иоур Питхон апп“ и наћи ћете иста четири реда: ФРОМ питхон:3.11-слим, ЦОПИ рекуирементс.ткт ., РУН пип инсталл -р рекуирементс.ткт, ЦОПИ . .. То ради. Такође испоручује слику од 200 МБ плус, полако се обнавља јер је свака инсталација зависности пуна кеш меморија која пропушта у тренутку када се промени један ред кода апликације, и тихо увлачи Ц компајлер и датотеке заглавља који ваш покренути контејнер више никада неће додирнути након завршетка изградње.
Ништа од тога више није потребно. Између ув (управљача пакетима заснованог на Руст-у и инсталатера из Астрала), БуилдКит кеш монтирања и основних слика без дистроле, подразумевана вредност за производни Питхон контејнер за 2026. је вишестепена изградња која испоручује само Питхон интерпретер, ваше виртуелно окружење и ваш код, ништа друго. Овај водич пролази кроз стари образац, нови образац и Доцкерфиле који можете копирати у прави пројекат данас.
Стари образац и зашто је скуп
DOCKERFILEFROM python:3.13-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["python", "app.py"]
Овај образац има три трошка који се повећавају како пројекат расте. Прво, питхон:3.13-слим се већ испоручује са отприлике 150 до 200 МБ компримовано пре него што додате једну зависност, јер "слим" и даље носи пуну Дебиан корисничко земљиште, апт и Ц екстензије стандардне библиотеке Питхон. Друго, сваки слој РУН пип инсталл је кеширан Доцкер-овим хешом садржаја претходних слојева, тако да се мења један ред у апп.пи пре ЦОПИ . . не поништава ништа узводно, али промена у рекуирементс.ткт поништава цео корак инсталације и поново преузима сваки точак. Треће, ако је за неку зависност потребна матична верзија (недостајући точак са много Линук-а, необична верзија пакета), пип тихо увлачи алате за прављење који онда заувек остаје у коначној слици, јер постоји само једна фаза у којој се може одбацити.
Нови образац: фаза ув градитеља плус завршна фаза без дистроле
Исправка је вишестепена израда: једна фаза која има компајлер, ув и ваш закључани фајл, а друга, много мања фаза која само копира готово виртуелно окружење и ваше стабло извора. Завршна фаза никада не види пип, ув, апт или Ц компајлер.
DOCKERFILEFROM python:3.13-slim AS builder COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ ENV UV_COMPILE_BYTECODE=1 UV_LINK_MODE=copy UV_PYTHON_DOWNLOADS=never WORKDIR /app RUN --mount=type=cache,target=/root/.cache/uv \ --mount=type=bind,source=uv.lock,target=uv.lock \ --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ uv sync --frozen --no-install-project --no-dev COPY . /app RUN --mount=type=cache,target=/root/.cache/uv uv sync --frozen --no-dev FROM gcr.io/distroless/python3-debian12 COPY --from=builder /app /app WORKDIR /app ENV PATH="/app/.venv/bin:$PATH" ENTRYPOINT ["/app/.venv/bin/python", "-m", "app"]
гцр.ио/дистролесс/питхон3-дебиан12 нема љуску, нема менаџера пакета и нема пип-а, што је управо оно што желите у продукцији: у контејнеру није остало ништа што би нападач који добије извршење кода могао да искористи да би увукао више алата. Коначна слика су пакети сајта вашег виртуелног окружења плус ваш код, који за типичну ФастАПИ услугу заузима знатно мање од 50МБ уместо 200МБ-плус.
БуилдКит кеш монтирања: никада не преузимајте поново исти точак двапут
Линија --моунт=типе=цацхе,таргет=/роот/.цацхе/ув овде ради прави посао. Без тога, свака доцкер буилд на свежем покретачу поново преузима сваки точак са ПиПИ-ја, јер кеш слоја опстаје само ако су претходни слојеви, укључујући ЦОПИ ув.лоцк, идентични бајтовима. БуилдКит кеш монтирање је трајни волумен изван графа слојева: он опстаје у свим верзијама на истом хосту или, са позадином кеша регистратора, у ЦИ покретачима, чак и када се закључава датотека промени. Упарите га са ув синц --фрозен, који одбија да додирне датотеку закључавања и гласно не успева ако пипројецт.томл и ув.лоцк нису синхронизовани, уместо да тихо решава другачије стабло зависности од оног на коме су ваши тестови радили.
Раздвајање корака ув синц --но-инсталл-пројецт од коначног ув синц је друга половина трика: први позив инсталира само зависности треће стране (кеширане све док се ув.лоцк не мења), а други позив, покренути након ЦОПИ . /апп, инсталира ваш пројекат без поновног додиривања пакета трећих страна. Промените једну линију кода апликације и слој зависности остаје кеширан.
Нативне зависности: проблем нумпи, јастук и многолинук
Пакети као што су нумпи и Пиллов испоручују унапред изграђене манилинук точкове за уобичајене платформе, тако да на линук/амд64 или линук/арм64 ув синц обично само преузима точак и никада не додирује компајлер. Режим грешке се појављује када сте на необичној архитектури, закачите сасвим ново издање пре него што точкови сустижу или зависи од пакета који шаље само изворну дистрибуцију. У том случају фази изградње треба алат за изградњу, последња фаза никада не сме да види:
DOCKERFILEFROM python:3.13-slim AS builder RUN apt-get update && apt-get install -y --no-install-recommends build-essential \ && rm -rf /var/lib/apt/lists/* # uv + sync steps as in the stage above
буилд-ессентиал (гцц, маке, либц заглавља) живи само у фази прављења. Завршна фаза без дистроле копира већ компајлирани .венв, никада компајлер који га је направио. Ако желите да вежбате прављење и испоруку праве контејнерске услуге од краја до краја, ФастАПИ курс пролази кроз управо ову врсту АПИ-ја, од прве крајње тачке до примене у облику производње.
Питхон којим управља ув: престаните зависити од тога који интерпретатор је основна слика испоручена
питхон:3.13-слим вам даје било коју верзију закрпе коју је Дебиан одлучио да испоручи те недеље. уместо тога ув може сам да управља интерпретатором: ув питхон инсталл 3.13.1 преузима специфичну, репродуцибилну ЦПитхон верзију из питхон-буилд-стандалоне пројекта и закачује је у .питхон-версион, тако да ваша фаза градитеља и ваш лаптоп покрећу потпуно исти интерпретер све до закрпе. У комбинацији са УВ_ПИТХОН_ДОВНЛОАДС=никад у Доцкерфиле-у, тако да погрешно закачена верзија гласно пропада у изградњи уместо да тихо преузима нешто другачије, ово затвара празнину „ради на мојој машини, не ради на покретачу“ коју плутајућа ознака основне слике оставља отвореном.
Отклањање грешака у контејнеру без шкољке
Једина стварна цена дистролесс-а: нема љуске, тако да доцкер екец -ит контејнер сх не ради. За локално отклањање грешака, направите исти Доцкерфиле са циљем који се зауставља у фази прављења (доцкер буилд --таргет=буилдер -т миапп:дебуг .), који још увек има пуно корисничко земљиште и љуску питхон:3.13-слим. Држите тај циљ за отклањање грешака ван вашег цевовода за постављање; постоји за ваш терминал, а не за производњу.
Шаблон са једном датотеком
DOCKERFILEFROM python:3.13-slim AS builder COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ ENV UV_COMPILE_BYTECODE=1 UV_LINK_MODE=copy UV_PYTHON_DOWNLOADS=never WORKDIR /app RUN --mount=type=cache,target=/root/.cache/uv \ --mount=type=bind,source=uv.lock,target=uv.lock \ --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ uv sync --frozen --no-install-project --no-dev COPY . /app RUN --mount=type=cache,target=/root/.cache/uv uv sync --frozen --no-dev FROM gcr.io/distroless/python3-debian12 COPY --from=builder /app /app WORKDIR /app ENV PATH="/app/.venv/bin:$PATH" ENTRYPOINT ["/app/.venv/bin/python", "-m", "app"]
Копирајте ово, промените назив модула ЕНТРИПОИНТ да би одговарао изгледу вашег пројекта и имаћете верзију која је мања, бржа у поновљеним градњама и тежа за напад од шаблона пип инсталл -р рекуирементс.ткт који се у већини туторијала још увек учи. Спремни да вежбате позадину која се налази унутар овог контејнера? Почните са ФастАПИ.
ФАК
Да ли треба да буде омогућен БуилдКит да би монтирање кеша радило?
Да, --моунт=типе=цацхе је функција само за БуилдКит. Био је подразумевани програмер у Доцкер Десктоп-у и недавним издањима Доцкер Енгине-а, али на старијим ЦИ покретачима можда ће вам требати експлицитно подешен ДОЦКЕР_БУИЛДКИТ=1 или доцкер буилдк буилд уместо обичне доцкер буилд.
Зашто једноставно не користите питхон:3.13-алпине за мању слику?
Алпине-ов мусл либц разбија претпоставку о многим линук точковима на коју се ослањају нумпи, Пиллов и већина компајлираних пакета, тако да губите унапред изграђене точкове и или компајлирате из извора или погађате суптилне грешке у току извршавања. дистролесс-глибц избегава ту замку.
Да ли ув у потпуности замењује пип и поезију?
За већину нових пројеката, да. ув се решава и инсталира брже, чита исти пипројецт.томл и генерише лоцкфиле, али ако тим већ зависи од Поетри додатака или ув радни ток још увек не покрива, нема хитне миграције усред пројекта. Прво испробајте УВ на новој услузи.
Шта ако је мојој основној слици потребна безбедносна закрпа након што сам већ направио слику?
Ребуилд. Закачите сажетак, а не само ознаку, за питхон:3.13-слим у фази прављења и поново направите по распореду, недељно је разумно за већину тимова, тако да закрпљена основна слика прелази у нову верзију уместо да стоји устајала месецима.
Могу ли да користим овај образац за Дјанго пројекат уместо ФастАПИ-ја?
Да, Доцкерфиле-у није важно који оквир покрећете; мења се само последња ЕНТРИПОИНТ (на пример гуницорн мипројецт.всги:апплицатион). ФастАПИ курс је брз начин да вежбате шаблон од краја до краја ако покрећете нову услугу.
Да ли је дистролесс спреман за производњу или је још увек експерименталан?
Широко се користи у производњи; Гоогле га одржава и многи тимови га испоручују као своју подразумевану Питхон базу. Компромис за прихватање уласка је недостатак љуске, што је намеран безбедносни избор, а не грешка.