Tiny Docker-ôfbyldings dy't yn harsels leauden *

[ferwizing nei it Amerikaanske berne mearke "The Little Engine That Could" - ca. lane]*

Tiny Docker-ôfbyldings dy't yn harsels leauden *

Hoe kinne jo automatysk lytse Docker-ôfbyldings meitsje foar jo behoeften

Ungewoane obsession

De ôfrûne pear moannen bin ik obsedearre mei hoe lyts in Docker-ôfbylding kin wêze en de applikaasje noch altyd draait?

Ik begryp it, it idee is nuver.

Foardat ik yn 'e details en technyske saken gean, wol ik graach útlizze wêrom't dit probleem foar my sa ynteressant is en hoe't it jo oanbelanget.

Wêrom grutte saken

Troch de ynhâld fan 'e Docker-ôfbylding te ferminderjen, ferminderje wy dêrmei de list mei kwetsberens. Derneist meitsje wy de ôfbyldings skjinner, om't se allinich befetsje wat nedich is om applikaasjes út te fieren.

D'r is noch ien lyts foardiel - ôfbyldings wurde in bytsje rapper downloade, mar nei myn miening is dit net sa wichtich.

Tink derom: as jo soargen meitsje oer grutte, binne de Alpine-looks sels lyts en sille jo wierskynlik passe.

Distroless ôfbyldings

Projekt Distroless biedt in seleksje fan basale "distroless" ôfbyldings, se befetsje gjin pakketbehearders, skelpen en oare nutsfoarsjenningen dy't jo wend binne om te sjen op 'e kommandorigel. As gefolch brûke pakketbehearders lykas pip и apt sil net wurkje:

FROM gcr.io/distroless/python3
RUN  pip3 install numpy

Dockerfile mei Python 3 distroless ôfbylding

Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM gcr.io/distroless/python3
 ---> 556d570d5c53
Step 2/2 : RUN  pip3 install numpy
 ---> Running in dbfe5623f125
/bin/sh: 1: pip3: not found

Pip is net yn 'e ôfbylding

Normaal wurdt dit probleem oplost troch in multi-stage build:

FROM python:3 as builder
RUN  pip3 install numpy

FROM gcr.io/distroless/python3
COPY --from=builder /usr/local/lib/python3.7/site-packages /usr/local/lib/python3.5/

Multi-stage montage

It resultaat is in ôfbylding fan 130MB yn grutte. Net al te min! Foar fergeliking: de standert Python-ôfbylding waacht 929MB, en de "tinere" (3,7-slim) - 179MB, alpine ôfbylding (3,7-alpine) is 98,6MB, wylst de basis distroless ôfbylding brûkt yn it foarbyld is 50,9MB.

It is earlik om oan te jaan dat wy yn it foarige foarbyld in hiele map kopiearje /usr/local/lib/python3.7/site-packages, dy't ôfhinklikens befetsje kinne dy't wy net nedich binne. Hoewol't it is dúdlik dat de grutte ferskil fan alle besteande Python basis ôfbyldings fariearret.

Op it stuit fan skriuwen stipet Google distroless net in protte ôfbyldings: Java en Python binne noch yn it eksperimintele stadium, en Python bestiet allinich foar 2,7 en 3,5.

Tiny bylden

Werom nei myn obsesje mei it meitsjen fan lytse bylden.

Yn it algemien woe ik sjen hoe't distroless bylden wurde konstruearre. It distroless projekt brûkt Google's build-ark bazel. It ynstallearjen fan Bazel en it skriuwen fan jo eigen ôfbyldings koste lykwols in protte wurk (en om earlik te wêzen, it opnij útfine is leuk en learsum). Ik woe it meitsjen fan lytsere bylden ferienfâldigje: it meitsjen fan in byld moat ekstreem ienfâldich wêze, banaal. Dat d'r gjin konfiguraasjebestannen foar jo binne, mar ien rigel yn 'e konsole: просто собрать образ для <приложение>.

Dus, as jo jo eigen ôfbyldings wolle meitsje, wit dan: d'r is sa'n unyk docker-ôfbylding, scratch. Scratch is in "lege" ôfbylding, d'r binne gjin bestannen yn, hoewol it standert weegt - wow! - 77 bytes.

FROM scratch

Scratch ôfbylding

It idee fan in krasôfbylding is dat jo alle ôfhinklikens fan 'e hostmasine deryn kinne kopiearje en se brûke yn in Dockerfile (dit is as kopiearje nei apt en ynstallearje fanôf it begjin), of letter as de Docker-ôfbylding materialisearre is. Hjirmei kinne jo de ynhâld fan 'e Docker-kontener folslein kontrolearje, en dus de grutte fan' e ôfbylding folslein kontrolearje.

No moatte wy dizze ôfhinklikens op ien of oare manier sammelje. Besteande ark lykas apt tastean jo pakketten te downloaden, mar se binne bûn oan 'e hjoeddeistige masine en stypje ommers gjin Windows of MacOS.

Dat ik sette út om myn eigen ark te bouwen dat automatysk in basisôfbylding fan 'e lytste mooglike grutte soe bouwe en ek elke applikaasje útfiere. Ik brûkte Ubuntu / Debian-pakketten, makke in seleksje (pakketten direkt fan 'e repositories krije) en rekursyf fûn har ôfhinklikens. It programma soe automatysk de lêste stabile ferzje fan it pakket downloade, sadat de feiligensrisiko's safolle mooglik minimalisearje.

Ik neamde it ark fetchy, want hy... fynt en bringt... wat nedich is [út it Ingelsk "helje", "bringe" - ca. lane]. It ark wurket fia in kommandorigelynterface, mar biedt tagelyk in API.

Om in ôfbylding te sammeljen mei fetchy (litte ús dizze kear in Python-ôfbylding nimme), jo moatte gewoan de CLI sa brûke: fetchy dockerize python. Jo kinne wurde frege foar it doel bestjoeringssysteem en koadenamme omdat fetchy brûkt op it stuit allinich pakketten basearre op Debian en Ubuntu.

No kinne jo kieze hokker ôfhinklikens hielendal net nedich binne (yn ús kontekst) en se útslute. Python is bygelyks ôfhinklik fan perl, hoewol it goed wurket sûnder Perl ynstalleare.

Resultaten

Python-ôfbylding makke mei it kommando fetchy dockerize python3.5 waacht mar 35MB (Ik bin mear as wis dat it yn 'e takomst noch lichter makke wurde kin). It docht bliken dat wy it slagge om noch 15 WW ôf te skearen fan it distroless byld.

Jo kinne alle ôfbyldings sjen dy't oant no binne sammele hjir.

Projekt - hjir.

As jo ​​funksjes misse, meitsje gewoan in fersyk oan - ik sil graach helpe :) Noch mear, ik wurkje op it stuit oan it yntegrearjen fan oare pakketbehearders yn fetchy, sadat d'r gjin ferlet is fan multi-stage builds.

Boarne: www.habr.com

Add a comment