Tiny images Docker chì credevanu in sè stessu *

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

Tiny images Docker chì credevanu in sè stessu *

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

Prughjettu Distroless 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 numpy

Dockerfile 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 found

Pip ù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 scratch

Scratch 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 permette di scaricà pacchetti, ma sò ligati à a macchina attuale è, dopu, ùn sustene micca Windows o MacOS.

Allora aghju stabilitu à custruisce u mo propiu strumentu chì custruisce automaticamente una maghjina di basa di u più chjucu pussibule è ancu eseguisce ogni applicazione. Aghju utilizatu pacchetti Ubuntu / Debian, aghju fattu una selezzione (ottene pacchetti direttamente da i repositori) è ricursivamente trovu e so dipendenze. U prugramma hà da esse scaricatu automaticamente l'ultima versione stabile di u pacchettu, minimizendu i risichi di sicurezza quant'è pussibule.

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 in 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à ccà.

prughjettu - ccà.

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

Add a comment