Las imágenes "distrols" contienen solo su aplicación y sus dependencias de tiempo de ejecución. No contienen administradores de paquetes, conchas o cualquier otro programa que espere encontrar en una distribución estándar de Linux.
Para obtener más información, consulte esta charla (video).
Desde marzo de 2023, las imágenes distrolectivas usan manifiestas OCI, si ve errores de referencia a application/vnd.oci.image.manifest.v1+json
o application/vnd.oci.image.index.v1+json
, actualiza su herramienta de contenedor (Docker,, Docker,, Docker, Docker, Docker, Docker, Docker, Docker, Docker, Docker, JIB, etc) a la última.
Restringir lo que hay en su contenedor de tiempo de ejecución a precisamente lo que es necesario para su aplicación es una mejor práctica empleada por Google y otros gigantes tecnológicos que han utilizado contenedores en producción durante muchos años. Mejora la señal al ruido de los escáneres (por ejemplo, CVE) y reduce la carga de establecer la procedencia a lo que necesita.
Las imágenes distrolectivas son muy pequeñas . La imagen distrolse más pequeña, gcr.io/distroless/static-debian12
, es alrededor de 2 MIB. Eso es aproximadamente el 50% del tamaño de alpine
(~ 5 MIB), y menos del 2% del tamaño de debian
(124 MIB).
Estas imágenes se construyen con bazel, pero también se pueden usar a través de otras herramientas de compilación de imágenes de Docker.
Las siguientes imágenes son publicadas y actualizadas actualmente por el Proyecto Distoless (ver Support_Policy para líneas de tiempo de soporte)
Imagen | Etiquetas | Sufijos de arquitectura |
---|---|---|
GCR.IO/DISTROLESS/STATICEDEBIAN12 | Último, non-root, depug, depuración y narrada | AMD64, ARM64, ARM, S390X, PPC64LE |
GCR.IO/DISTROLESS/BASEDEBIAN12 | Último, non-root, depug, depuración y narrada | AMD64, ARM64, ARM, S390X, PPC64LE |
GCR.IO/DISTROLESS/BASE-NOSSL-DEBIAN12 | Último, non-root, depug, depuración y narrada | AMD64, ARM64, ARM, S390X, PPC64LE |
GCR.IO/DISTROLESS/CC-DEBIAN12 | Último, non-root, depug, depuración y narrada | AMD64, ARM64, ARM, S390X, PPC64LE |
GCR.IO/DISTROLESS/PYTHON3-DEBIAN12 | Último, non-root, depug, depuración y narrada | AMD64, ARM64 |
GCR.IO/DISTROLESS/JAVA-BASE-DEBIAN12 | Último, non-root, depug, depuración y narrada | AMD64, ARM64, S390X, PPC64LE |
GCR.IO/DISTROLESS/JAVA17-DEBIAN12 | Último, non-root, depug, depuración y narrada | AMD64, ARM64, S390X, PPC64LE |
GCR.IO/DISTROLESS/JAVA21-DEBIAN12 | Último, non-root, depug, depuración y narrada | AMD64, ARM64, PPC64LE |
GCR.IO/DISTROLESS/NODEJS18-DEBIAN12 | Último, non-root, depug, depuración y narrada | AMD64, ARM64, ARM, S390X, PPC64LE |
GCR.IO/DISTROLESS/NODEJS20-DEBIAN12 | Último, non-root, depug, depuración y narrada | AMD64, ARM64, ARM, S390X, PPC64LE |
GCR.IO/DISTROLESS/NODEJS22-DEBIAN12 | Último, non-root, depug, depuración y narrada | AMD64, ARM64, ARM, S390X, PPC64LE |
Estas imágenes se refieren a los índices de imágenes con referencias a todas las arquitecturas compatibles. Las imágenes específicas de la arquitectura se pueden hacer referencia directamente utilizando un sufijo de arquitectura adicional en la etiqueta, como gcr.io/distroless/static-debian12:latest-amd64
Cualquier otra etiqueta se considera en desuso y ya no se actualizan
COSIGN FIRMADA TODAS LAS IMÁGENES DE DistRoles están firmadas con claves enfemerales (sin llave): este es el único mecanismo compatible a partir de noviembre de 2023. Recomendamos verificar cualquier imagen distrolera que use antes de construir su imagen. Puede verificar la firma sin llave de cualquier imagen distrolse con:
cosign verify $IMAGE_NAME --certificate-oidc-issuer https://accounts.google.com --certificate-identity [email protected]
Tenga en cuenta que las imágenes de distrolación de forma predeterminada no contienen un shell. Eso significa que el comando DockerFile ENTRYPOINT
, cuando se define, debe especificarse en forma vector
, para evitar el tiempo de ejecución del contenedor con un shell.
Esto funciona:
ENTRYPOINT ["myapp"]
Pero esto no funciona:
ENTRYPOINT "myapp"
Por las mismas razones, si el punto de entrada se establece en el vector vacío, el comando CMD debe especificarse en forma vector
(ver ejemplos a continuación). Tenga en cuenta que, de forma predeterminada, las imágenes Static, Base y CC tienen el punto de entrada vectorial vacío. Las imágenes con un tiempo de ejecución del idioma incluido tienen un idioma predeterminado específico del idioma (ver: Java, NodeJS, Python3).
Las construcciones de Docker Multi-Stage hacen que el uso de imágenes de distrols sea fácil. Siga estos pasos para comenzar:
Elija la imagen base correcta para su pila de aplicaciones.
Escriba un archivo Docker de varias etapas. Nota: Esto requiere Docker 17.05 o superior.
La idea básica es que tendrá una etapa para construir artefactos de su aplicación e insertarlos en su imagen de distracción de tiempo de ejecución. Si desea obtener más información, consulte la documentación sobre compilaciones de varias etapas.
Aquí hay un ejemplo rápido para Go:
# Start by building the application.
FROM golang:1.18 as build
WORKDIR /go/src/app
COPY . .
RUN go mod download
RUN CGO_ENABLED=0 go build -o /go/bin/app
# Now copy it into our base image.
FROM gcr.io/distroless/static-debian12
COPY --from=build /go/bin/app /
CMD [ "/app" ]
Puede encontrar otros ejemplos aquí:
Para ejecutar cualquier ejemplo, vaya al directorio para el idioma y ejecute
docker build -t myapp .
docker run -t myapp
Para ejecutar Node.js Express App Node-Express y exponer los puertos del contenedor:
npm install # Install express and its transitive dependencies
docker build -t myexpressapp . # Normal build command
docker run -p 3000:3000 -t myexpressapp
Esto debería exponer la aplicación expresa a su localhost: 3000
Para obtener la documentación completa sobre cómo usar Bazel para generar imágenes de contenedores, consulte el repositorio Bazel-Contrib/Rules_OCI.
Para la documentación y el ejemplo sobre cómo usar el Administrador de paquetes de Debian Based GO (actual) para generar la configuración de bazel, consulte ./debian_package_manager para documentación y ejemplos sobre cómo usar las reglas del Administrador de paquetes de bazel (no utilizados en este repositorio), ver. /paquete_manager
Se pueden encontrar ejemplos en este repositorio en el directorio de ejemplos.
Tenemos algunos ejemplos sobre cómo ejecutar algunas pilas de aplicaciones comunes en el directorio /ejemplos. Vea aquí para:
Vea aquí para ejemplos sobre cómo completar algunas tareas comunes en su imagen:
Vea aquí para obtener más información sobre cómo se construyen y lanzan estas imágenes.
Las imágenes de distrols se basan en Debian 12 (ratón de biblioteca). Las imágenes se etiquetan explícitamente con sufijos de versión Debian (por ejemplo, -debian12
). Especificar una imagen sin la distribución actualmente seleccionará las imágenes -debian12
, pero eso cambiará en el futuro a una versión más nueva de Debian. Puede ser útil hacer referencia a la distribución explícitamente, para evitar la ruptura de las construcciones cuando se lanza la próxima versión de Debian.
Distoless rastrea las versiones de Debian ascendentes, utilizando acciones de GitHub para generar automáticamente una solicitud de extracción cuando hay actualizaciones.
Las imágenes distrolosas son mínimas y carecen de acceso de concha. El conjunto de imágenes :debug
para cada idioma proporciona un shell de BusyBox para ingresar.
Por ejemplo:
cd examples/python3/
Edite el Dockerfile
para cambiar la imagen final a :debug
:
FROM gcr.io/distroless/python3-debian12:debug
COPY . /app
WORKDIR /app
CMD [ "hello.py" , "/etc" ]
Luego construya y inicia con un punto de entrada de shell:
$ docker build -t my_debug_image .
$ docker run --entrypoint=sh -ti my_debug_image
/app # ls
BUILD Dockerfile hello.py
Nota: Si la imagen que está utilizando ya tiene una etiqueta, por ejemplo,
gcr.io/distroless/java17-debian12:nonroot
, use ladebug-<existing tag>
en su lugar, por ejemplogcr.io/distroless/java17-debian12:debug-nonroot
.
Nota: LDD no está instalado en la imagen base, ya que es un script de shell, puede copiarlo o descargarlo.
Si su proyecto usa distrols, ¡envíe un PR para agregar su proyecto aquí!