[riferimentu à u conte di fata americanu di i zitelli "U Little Engine That Could" - ca. corsia]*

Cumu creà automaticamente picculi imaghjini Docker per i vostri bisogni
Obsession inusual
Per l'ultimi dui mesi, sò ossessionatu da quantu pò esse chjuca una maghjina Docker è avè sempre l'applicazione in esecuzione?
Capiscu, l'idea hè strana.
Prima di entre in i ditagli è i tecnichi, vogliu spiegà perchè stu prublema m'hà tantu disturbatu, è cumu vi cuncerna.
Perchè a dimensione importa
Riducendu u cuntenutu di l'imaghjini Docker, riducemu cusì a lista di vulnerabili. Inoltre, facemu l'imaghjini più puliti, perchè cuntenenu solu ciò chì hè necessariu per eseguisce l'applicazioni.
Ci hè un vantaghju più chjucu - l'imaghjini sò scaricati un pocu più veloce, ma, in my opinion, questu ùn hè micca cusì impurtante.
Per piacè nutate: Sè vo site preoccupatu per a taglia, l'Alpine pare chì sò chjuchi è sò sicuru d'adattà.
Imàgini senza distruzzioni
offre una selezzione di imaghjini basi "distroless", ùn cuntenenu micca gestori di pacchetti, cunchiglia è altre utilità chì site abituatu à vede nantu à a linea di cummanda. In u risultatu, utilizate gestori di pacchetti cum'è pip и apt ùn funziona micca:
FROM gcr.io/distroless/python3
RUN pip3 install numpyDockerfile utilizendu Python 3 distroless image
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 foundPip ùn hè micca in l'imaghjini
Di solitu, stu prublema hè risolta da una custruzzione in più fasi:
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/Assemblage multi-stadi
U risultatu hè una maghjina di 130 MB di dimensione. Ùn troppu male ! Per paragunà: l'imaghjina di Python predeterminata pesa 929 MB, è quella "più fina" (3,7-slim) - 179 MB, imagine alpina (3,7-alpine) hè 98,6MB, mentri l'imagine distroless di basa utilizata in l'esempiu hè 50,9MB.
Hè ghjustu à nutà chì in l'esempiu precedente avemu copiatu un annuariu sanu /usr/local/lib/python3.7/site-packages, chì pò cuntene dipendenze chì ùn avemu micca bisognu. Ancu s'ellu hè chjaru chì a diferenza di dimensione di tutte l'imaghjini di basa Python esistenti varieghja.
À u mumentu di a scrittura, Google distroless ùn sustene micca parechje imagine: Java è Python sò sempre in u stadiu sperimentale, è Python esiste solu per 2,7 è 3,5.
Picculi imagine
Torna à a mo obsessione cù a creazione di picculi imagine.
In generale, vulia vede cumu l'imaghjini distroless sò custruiti. U prughjettu distroless usa l'uttellu di creazione di Google bazel. In ogni casu, a stallazione di Bazel è a scrittura di e vostre imagine hà pigliatu assai travagliu (è per esse cumplettamente onestu, reinventà a rota hè divertente è educativu). Vuliu simplificà a creazione d'imaghjini più chjuchi: l'attu di creà una maghjina deve esse estremamente simplice, banale. Cusì ùn ci hè micca un schedariu di cunfigurazione per voi, solu una linea in a cunsola: просто собрать образ для <приложение>.
Allora, sè vo vulete creà e vostre propiu imagine, allora sapete: ci hè una maghjina docker cusì unica, scratch. Scratch hè una maghjina "viota", ùn ci sò micca schedarii in questu, ancu s'ellu pesa per automaticamente - wow! - 77 bytes.
FROM scratchScratch image
L'idea di una maghjina di scratch hè chì pudete copià qualsiasi dipendenze da a macchina host in questu è sia aduprate in un Dockerfile (questu hè cum'è copià à apt è installate da zero), o più tardi quandu l'imaghjini di Docker hè materializatu. Questu permette di cuntrullà cumpletamente u cuntenutu di u cuntinuu Docker, è cusì cuntrullà cumpletamente a dimensione di l'imaghjini.
Avà avemu bisognu di cullà in qualchì manera queste dipendenze. Strumenti esistenti cum'è apt vi permettenu di scaricà pacchetti, ma sò ligati à a macchina attuale è, in fine, ùn supportanu micca Windows o MacOS.
Cusì aghju decisu di custruisce u mo propiu strumentu chì custruisce automaticamente una maghjina di basa di a dimensione più chjuca pussibule è a face eseguisce qualsiasi applicazione. Aghju utilizatu pacchetti Ubuntu/Debian, hà realizatu una selezzione (recuperendu i pacchetti direttamente da i repositori) è hà trovu recursivamente e so dipendenze. U prugramma duvia scaricà automaticamente l'ultima versione stabile di u pacchettu, minimizendu i risichi di sicurezza.
Aghju chjamatu u strumentu fetchy, perchè ellu... trova è porta... ciò chì ci vole [da l'inglese "portà", "portà" - ca. corsia]. L'uttellu travaglia per una interfaccia di linea di cumanda, ma à u stessu tempu offre una API.
Per assemblà una maghjina usendu fetchy (pigliemu una maghjina di Python sta volta), basta à aduprà a CLI cusì: fetchy dockerize python. Pudete esse dumandatu u sistema upirativu di destinazione è u nome di codice perchè fetchy attualmente usa solu pacchetti basati nantu à Debian и Ubuntu.
Avà pudete sceglie quale dipendenze ùn sò micca necessariu (in u nostru cuntestu) è escludi. Per esempiu, Python dipende da perl, ancu s'ellu funziona bè senza Perl installatu.
Risultati
Image Python creata cù u cumandimu fetchy dockerize python3.5 pesa solu 35MB (sò più chè sicuru chì in u futuru pò esse fattu ancu più liggeru). Risulta chì avemu riisciutu à rasà un altru 15 WW da l'imagine distroless.
Pudete vede tutte l'imaghjini cullate finu à avà .
prughjettu - .
Sè vi mancanu funziunalità, basta à creà una dumanda - Seraghju felice d'aiutà :) Ancu di più, aghju attualmente travagliendu in l'integrazione di altri gestori di pacchetti in fetchy, in modu chì ùn ci hè micca bisognu di custruzzioni multi-stadi.
Source: www.habr.com
