[ferwizing nei it Amerikaanske berne mearke "The Little Engine That Could" - ca. lane]*
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
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
Projekt -
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