Pequeñas imágenes de Docker que creían en sí mismas*

[referencia al cuento infantil estadounidense "La pequeña locomotora que pudo" - aprox. carril]*

Pequeñas imágenes de Docker que creían en sí mismas*

Cómo crear automáticamente pequeñas imágenes de Docker para sus necesidades

Obsesión inusual

Durante los últimos meses, he estado obsesionado con lo pequeña que puede ser una imagen de Docker y aún tener la aplicación ejecutándose.

Entiendo, la idea es extraña.

Antes de entrar en detalles y tecnicismos, me gustaría explicar por qué este problema me molestó tanto y en qué le concierne.

Por qué el tamaño importa

Al reducir el contenido de la imagen de Docker, reducimos la lista de vulnerabilidades. Además, hacemos que las imágenes sean más limpias, porque contienen sólo lo necesario para ejecutar aplicaciones.

Hay una pequeña ventaja más: las imágenes se descargan un poco más rápido, pero, en mi opinión, esto no es tan importante.

Tenga en cuenta: si le preocupa el tamaño, los looks Alpine son pequeños y probablemente le queden bien.

Imágenes sin distribución

Proyecto sin distribución ofrece una selección de imágenes básicas "sin distribución", que no contienen administradores de paquetes, shells y otras utilidades que está acostumbrado a ver en la línea de comandos. Como resultado, utilice administradores de paquetes como pip и apt no funcionará:

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

Dockerfile usando una imagen sin 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 no está en la imagen.

Por lo general, este problema se resuelve mediante una compilación de 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/

Montaje en varias etapas

El resultado es una imagen de 130 MB de tamaño. ¡No está mal! A modo de comparación: la imagen predeterminada de Python pesa 929 MB y la "más delgada" (3,7-slim) - 179 MB, imagen alpina (3,7-alpine) es de 98,6 MB, mientras que la imagen base sin distribución utilizada en el ejemplo es de 50,9 MB.

Es justo señalar que en el ejemplo anterior estamos copiando un directorio completo /usr/local/lib/python3.7/site-packages, que puede contener dependencias que no necesitamos. Aunque está claro que la diferencia de tamaño de todas las imágenes base de Python existentes varía.

Al momento de escribir este artículo, Google sin distribución no admite muchas imágenes: Java y Python aún se encuentran en la etapa experimental, y Python solo existe para 2,7 y 3,5.

Pequeñas imágenes

Volviendo a mi obsesión por crear imágenes pequeñas.

En general, quería ver cómo se construyen las imágenes sin distribución. El proyecto distroless utiliza la herramienta de compilación de Google. bazel. Sin embargo, instalar Bazel y escribir tus propias imágenes requirió mucho trabajo (y, para ser honesto, reinventar la rueda es divertido y educativo). Quería simplificar la creación de imágenes más pequeñas: el acto de crear una imagen debería ser extremadamente simple, banal. Para que no tengas archivos de configuración, solo una línea en la consola: просто собрать образ для <приложение>.

Entonces, si desea crear sus propias imágenes, sepa: existe una imagen acoplable única, scratch. Scratch es una imagen "vacía", no contiene archivos, aunque pesa por defecto - ¡guau! - 77 bytes.

FROM scratch

Imagen rayada

La idea de una imagen borrador es que puede copiar cualquier dependencia de la máquina host en ella y usarla dentro de un Dockerfile (esto es como copiarla a apt e instalar desde cero), o más tarde, cuando se materialice la imagen de Docker. Esto le permite controlar completamente el contenido del contenedor Docker y, por lo tanto, controlar completamente el tamaño de la imagen.

Ahora necesitamos recopilar de alguna manera estas dependencias. Herramientas existentes como apt le permiten descargar paquetes, pero están vinculados a la máquina actual y, después de todo, no son compatibles con Windows o MacOS.

Así que me propuse crear mi propia herramienta que crearía automáticamente una imagen base del tamaño más pequeño posible y también ejecutaría cualquier aplicación. Utilicé paquetes de Ubuntu/Debian, hice una selección (obtuve paquetes directamente de los repositorios) y encontré recursivamente sus dependencias. Se suponía que el programa descargaría automáticamente la última versión estable del paquete, minimizando los riesgos de seguridad tanto como fuera posible.

Nombré la herramienta fetchy, porque él... encuentra y trae... lo que se necesita [De inglés “buscar”, “traer” - aprox. carril]. La herramienta funciona a través de una interfaz de línea de comandos, pero al mismo tiempo ofrece una API.

Para ensamblar una imagen usando fetchy (Esta vez tomemos una imagen de Python), solo necesita usar la CLI de esta manera: fetchy dockerize python. Es posible que se le solicite el sistema operativo de destino y el nombre en clave porque fetchy Actualmente sólo utiliza paquetes basados ​​en Debian y Ubuntu.

Ahora puedes elegir qué dependencias no son necesarias en absoluto (en nuestro contexto) y excluirlas. Por ejemplo, Python depende de Perl, aunque funciona bien sin Perl instalado.

resultados

Imagen de Python creada usando el comando fetchy dockerize python3.5 pesa sólo 35 MB (estoy más que seguro de que en el futuro se podrá hacer aún más ligero). Resulta que logramos reducir otros 15 WW de la imagen sin distribución.

Puedes ver todas las imágenes recopiladas hasta el momento. aquí.

Proyecto - aquí.

Si le faltan funciones, simplemente cree una solicitud; estaré encantado de ayudarle :) Aún más, actualmente estoy trabajando para integrar otros administradores de paquetes en fetchy, para que no haya necesidad de compilaciones de varias etapas.

Fuente: habr.com

Añadir un comentario