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
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à
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