Usando compilaciones de varias etapas, quiero reducir el tamaño de una imagen al final de Dockerfile, algo como esto:
FROM ubuntu AS ubuntu_build RUN # do a lot of build things FROM alpine COPY --from=ubuntu_build /app /app ENTRYPOINT whateverla imagen alpina es pequeña y, en teoría, solo se copiarán las cosas de /app de la imagen de ubuntu, ¿es este el mejor truco del libro o hay alguna otra forma de minimizar el tamaño de la imagen final?
Google proporciona instrucciones y herramientas para ayudar a crear imágenes sin distribución .
Las imágenes "Distroless" contienen solo su aplicación y sus dependencias de tiempo de ejecución. No contienen administradores de paquetes, shells ni ningún otro programa que esperaría encontrar en una distribución estándar de Linux.
¿Por qué debo usar imágenes sin distribución?
Restringir lo que hay en su contenedor de tiempo de ejecución a exactamente lo que es necesario para su aplicación es una práctica recomendada empleada por Google y otros gigantes tecnológicos que han usado contenedores en producción durante muchos años. Mejora la relación señal-ruido de los escáneres (por ejemplo, CVE) y reduce la carga de establecer la procedencia de lo que necesita.
Si su aplicación es un binario compilado, entonces podría salirse con la suya con un solo binario más las bibliotecas compartidas con las que se vincula. Si limita las bibliotecas con las que se vincula, es posible que solo necesite un par. Aquí, por ejemplo, está contra lo que un programa C mínimo compilado con enlaces gcc en mi máquina:
$ ldd basic-program linux-vdso.so.1 (0x00007fffd3fa2000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2e4611b000) /lib64/ld-linux-x86-64.so.2 (0x00007f2e4670e000)Diablos, incluso podría vincular estáticamente todo el programa y no tener dependencias en absoluto.
Google proporciona un conjunto de imágenes base dirigidas a diferentes idiomas:
Solo tienen algunos archivos esenciales, mucho menos de lo que incluso una distribución mínima como alpine obtiene, ya que todavía tiene el administrador de paquetes apk , las utilidades del espacio de usuario, etc. Los usa de la misma manera que describe en su pregunta: como el último etapa en una construcción de varias etapas.
FROM gcr.io/distroless/base COPY --from=build /go/bin/app / CMD ["/app"] También puede seguir la ruta completa de los alimentos crudos que viven en el bosque y construir su imagen final FROM scratch . No hay nada más puro que eso. No hay absolutamente nada que no hayas puesto tú mismo. Esta es la ruta que eligió traefik , por ejemplo.
FROM scratch COPY certs/ca-certificates.crt /etc/ssl/certs/ COPY traefik / EXPOSE 80 VOLUME ["/tmp"] ENTRYPOINT ["/traefik"]Además de usar multi-stage , otra forma típica es usar docker-slim para reducir el tamaño de la imagen final construida, como a continuación:
docker-slim build --http-probe your-name/your-appEl detalle se refiere a esta guía
Agregue otros extractos de pensamientos comunes de "Cinco formas de adelgazar sus imágenes de Docker" en caso de que lo necesite:
COPY . / , más, si no usa .gitignore , debe evitar usar COPY . / que puede copiar algunas cosas necesarias a la imagen.