Pequenas imaxes de Docker que crían en si mesmas*

[referencia ao conto de fadas infantil americano "The Little Engine That Could" - aprox. carril]*

Pequenas imaxes de Docker que crían en si mesmas*

Como crear automaticamente pequenas imaxes de Docker para as túas necesidades

Obsesión inusual

Durante os últimos meses, obsesionoume o pequena que pode ser unha imaxe de Docker e aínda teño a aplicación en execución?

Entendo, a idea é estraña.

Antes de entrar nos detalles e detalles técnicos, gustaríame explicar por que este problema me molestou tanto e como lle afecta a vostede.

Por que importa o tamaño

Ao reducir o contido da imaxe de Docker, reducimos así a lista de vulnerabilidades. Ademais, facemos as imaxes máis limpas, porque só conteñen o necesario para executar as aplicacións.

Hai unha pequena vantaxe máis: as imaxes descárganse un pouco máis rápido, pero, na miña opinión, isto non é tan importante.

Teña en conta: se che preocupa o tamaño, o aspecto alpino é pequeno e é probable que che encaixe.

Imaxes sen distribución

Proxecto Distroless ofrece unha selección de imaxes básicas "sen distribución", non conteñen xestores de paquetes, shells e outras utilidades que está acostumado a ver na liña de comandos. Como resultado, use xestores de paquetes como pip и apt non funcionará:

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

Dockerfile usando imaxe sen distribución de Python 3

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 non está na imaxe

Normalmente este problema resólvese mediante unha compilación en varias etapas:

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/

Montaxe en varias etapas

O resultado é unha imaxe de 130 MB de tamaño. Non demasiado mal! Para comparación: a imaxe predeterminada de Python pesa 929 MB e a "máis fina" (3,7-slim) - 179 MB, imaxe alpina (3,7-alpine) é de 98,6 MB, mentres que a imaxe base sen distribución usada no exemplo é de 50,9 MB.

É xusto sinalar que no exemplo anterior estamos copiando un directorio enteiro /usr/local/lib/python3.7/site-packages, que pode conter dependencias que non precisamos. Aínda que está claro que a diferenza de tamaño de todas as imaxes de base de Python existentes varía.

No momento de escribir este artigo, Google distroless non admite moitas imaxes: Java e Python aínda están en fase experimental, e Python só existe para 2,7 e 3,5.

Pequenas imaxes

Volvo á miña obsesión por crear pequenas imaxes.

En xeral, quería ver como se constrúen as imaxes sen distros. O proxecto distroless usa a ferramenta de compilación de Google bazel. Non obstante, instalar Bazel e escribir as túas propias imaxes levou moito traballo (e para ser honesto, reinventar a roda é divertido e educativo). Quería simplificar a creación de imaxes máis pequenas: o acto de crear unha imaxe debería ser extremadamente sinxelo, banal. Para que non haxa ficheiros de configuración para ti, só hai unha liña na consola: просто собрать образ для <приложение>.

Entón, se queres crear as túas propias imaxes, sabe: hai unha imaxe docker tan única, scratch. Scratch é unha imaxe "baleira", non hai ficheiros nela, aínda que pesa por defecto - ¡Guau! - 77 bytes.

FROM scratch

Rasca imaxe

A idea dunha imaxe de cero é que pode copiar nela calquera dependencia da máquina host e usalas dentro dun ficheiro Docker (isto é como copialas a apt e instalar desde cero), ou máis tarde cando se materialice a imaxe de Docker. Isto permítelle controlar completamente o contido do contedor Docker e, polo tanto, controlar completamente o tamaño da imaxe.

Agora temos que recoller dalgún xeito estas dependencias. Ferramentas existentes como apt permítenche descargar paquetes, pero están ligados á máquina actual e, despois de todo, non admiten Windows nin MacOS.

Así que me dexen a construír a miña propia ferramenta que construíse automaticamente unha imaxe base do menor tamaño posible e tamén executase calquera aplicación. Usei paquetes Ubuntu/Debian, fixen unha selección (obtendo paquetes directamente dos repositorios) e atopei recursivamente as súas dependencias. O programa debía descargar automaticamente a última versión estable do paquete, minimizando os riscos de seguridade na medida do posible.

Chamei a ferramenta fetchy, porque el... atopa e trae... o que fai falta [do inglés "traer", "traer" - aprox. carril]. A ferramenta funciona a través dunha interface de liña de comandos, pero ao mesmo tempo ofrece unha API.

Para montar unha imaxe usando fetchy (Tomemos unha imaxe de Python esta vez), só tes que usar a CLI deste xeito: fetchy dockerize python. É posible que se lle solicite o sistema operativo de destino e o nome en clave porque fetchy actualmente só usa paquetes baseados en Debian e Ubuntu.

Agora podes escoller que dependencias non son necesarias en absoluto (no noso contexto) e excluílas. Por exemplo, Python depende de Perl, aínda que funciona ben sen Perl instalado.

Descubrimentos

Imaxe de Python creada usando o comando fetchy dockerize python3.5 só pesa 35 MB (estou máis que seguro de que no futuro pode ser aínda máis lixeiro). Resulta que conseguimos afeitar outros 15 WW da imaxe sen distro.

Podes ver todas as imaxes recollidas ata o momento aquí.

Proxecto - aquí.

Se che faltan funcións, só tes que crear unha solicitude. Estarei encantado de axudar :) Aínda máis, actualmente estou traballando na integración doutros xestores de paquetes en fetchy, para que non faga falta compilacións en varias etapas.

Fonte: www.habr.com

Engadir un comentario