Les images "distro" ne contiennent que votre application et ses dépendances d'exécution. Ils ne contiennent pas de gestionnaires de packages, de shells ou de tout autre programme que vous vous attendez à trouver dans une distribution Linux standard.
Pour plus d'informations, consultez cette conversation (vidéo).
Depuis mars 2023, les images distro utilisent les manifestes OCI, si vous voyez des erreurs faisant référence à application/vnd.oci.image.manifest.v1+json
ou application/vnd.oci.image.index.v1+json
, mettez à jour votre outillage de conteneurs (docker, foc, etc.) au plus tard.
Restriser ce qui se trouve dans votre conteneur d'exécution pour précisément ce qui est nécessaire pour votre application est la meilleure pratique utilisée par Google et d'autres géants de la technologie qui utilisent des conteneurs en production depuis de nombreuses années. Il améliore le signal au bruit des scanners (par exemple CVE) et réduit le fardeau de l'établissement de la provenance à ce dont vous avez besoin.
Les images distro sont très petites . L'image la plus petite distro, gcr.io/distroless/static-debian12
, est d'environ 2 MIB. Cela représente environ 50% de la taille de l' alpine
(~ 5 MIB) et moins de 2% de la taille de debian
(124 MIB).
Ces images sont construites à l'aide de Bazel, mais elles peuvent également être utilisées via d'autres outils de construction d'images Docker.
Les images suivantes sont actuellement publiées et mises à jour par le projet Distroless (voir support_policy pour les délais de support)
Image | Balises | Suffixes d'architecture |
---|---|---|
gcr.io/distrolesless/static-debian12 | Dernière, non-root, débogage, débogage-non. | AMD64, ARM64, ARM, S390X, PPC64LE |
gcr.io/distrolesless/base-debian12 | Dernière, non-root, débogage, débogage-non. | AMD64, ARM64, ARM, S390X, PPC64LE |
gcr.io/distrolesless/base-nossl-debian12 | Dernière, non-root, débogage, débogage-non. | AMD64, ARM64, ARM, S390X, PPC64LE |
gcr.io/distrolesless/cc-debian12 | Dernière, non-root, débogage, débogage-non. | AMD64, ARM64, ARM, S390X, PPC64LE |
gcr.io/distrolesless/python3-debian12 | Dernière, non-root, débogage, débogage-non. | AMD64, ARM64 |
gcr.io/distrolesless/java-base-debian12 | Dernière, non-root, débogage, débogage-non. | AMD64, ARM64, S390X, PPC64LE |
gcr.io/distrolesless/java17-debian12 | Dernière, non-root, débogage, débogage-non. | AMD64, ARM64, S390X, PPC64LE |
gcr.io/distrolesless/java21-debian12 | Dernière, non-root, débogage, débogage-non. | AMD64, ARM64, PPC64LE |
gcr.io/distroless/nodejs18-debian12 | Dernière, non-root, débogage, débogage-non. | AMD64, ARM64, ARM, S390X, PPC64LE |
gcr.io/Distroless/nodejs20-debian12 | Dernière, non-root, débogage, débogage-non. | AMD64, ARM64, ARM, S390X, PPC64LE |
GCR.IO/Distroless/Nodejs22-Debian12 | Dernière, non-root, débogage, débogage-non. | AMD64, ARM64, ARM, S390X, PPC64LE |
Ces images se réfèrent aux index d'image avec des références à toutes les architectures prises en charge. Les images spécifiques à l'architecture peuvent être directement référencées à l'aide d'un suffixe d'architecture supplémentaire sur la balise, comme gcr.io/distroless/static-debian12:latest-amd64
Toute autre étiquette est considérée comme obsolète et ne sont plus mises à jour
Toutes les images distro sont signées par Cosign avec des clés de lance (sans clé) - c'est le seul mécanisme pris en charge à partir de novembre 2023. Nous vous recommandons de vérifier toute image distroleuse que vous utilisez avant de construire votre image. Vous pouvez vérifier la signature sans clé de toute image distroleuse avec:
cosign verify $IMAGE_NAME --certificate-oidc-issuer https://accounts.google.com --certificate-identity [email protected]
Notez que les images distro-sans défaut ne contiennent pas de shell. Cela signifie que la commande dockerfile ENTRYPOINT
, lorsqu'elle est définie, doit être spécifiée sous forme vector
, pour éviter la préfixe d'exécution du conteneur avec un shell.
Cela fonctionne:
ENTRYPOINT ["myapp"]
Mais cela ne fonctionne pas:
ENTRYPOINT "myapp"
Pour les mêmes raisons, si le point d'entrée est défini sur le vecteur vide, la commande CMD doit être spécifiée sous forme vector
(voir les exemples ci-dessous). Notez que par défaut, les images statiques, Base et CC ont le point d'entrée de vecteur vide. Les images avec un runtime de langue incluse ont une valeur par défaut spécifique à la langue (voir: Java, Nodejs, Python3).
Les versions à plusieurs étages Docker facilitent l'utilisation des images distrodes. Suivez ces étapes pour commencer:
Choisissez la bonne image de base pour votre pile d'application.
Écrivez un fichier docker à plusieurs étapes. Remarque: Cela nécessite Docker 17.05 ou plus.
L'idée de base est que vous aurez une étape pour construire vos artefacts d'application et les insérer dans votre image de distration d'exécution. Si vous souhaitez en savoir plus, veuillez consulter la documentation sur les versions en plusieurs étapes.
Voici un exemple rapide pour 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" ]
Vous pouvez trouver d'autres exemples ici:
Pour exécuter n'importe quel exemple, accédez au répertoire pour la langue et exécutez
docker build -t myapp .
docker run -t myapp
Pour exécuter le Node.js Express App Node-Express et exposer les ports du conteneur:
npm install # Install express and its transitive dependencies
docker build -t myexpressapp . # Normal build command
docker run -p 3000:3000 -t myexpressapp
Cela devrait exposer la demande express à votre local host: 3000
Pour une documentation complète sur la façon d'utiliser Bazel pour générer des images de conteneurs, consultez le référentiel Bazel-Contrib / Rule_OCI.
Pour la documentation et l'exemple sur la façon d'utiliser le gestionnaire de package Debian (actuel) basé sur GO (actuel) pour générer Bazel Config, voir ./debian_package_manager pour la documentation et des exemples sur la façon d'utiliser les règles Bazel Package Manager (non utilisées dans ce dépôt), voir. / package_manager
Des exemples peuvent être trouvés dans ce référentiel dans le répertoire d'exemples.
Nous avons quelques exemples sur la façon d'exécuter certaines piles d'applications courantes dans le répertoire / exemples. Voir ici pour:
Voir ici pour des exemples sur la façon de terminer certaines tâches courantes dans votre image:
Voir ici pour plus d'informations sur la façon dont ces images sont construites et publiées.
Les images distro sont basées sur Debian 12 (Bookworm). Les images sont explicitement marquées avec des suffixes de la version debian (par exemple -debian12
). La spécification d'une image sans distribution sélectionnera actuellement les images -debian12
, mais cela changera à l'avenir en une version plus récente de Debian. Il peut être utile de référencer explicitement la distribution, pour empêcher la rupture des constructions lorsque la prochaine version Debian est publiée.
La distro suit les versions de Debian en amont, en utilisant des actions GitHub pour générer automatiquement une demande de traction en cas de mises à jour.
Les images distro sont minimes et manquent d'accès à la coquille. L'ensemble d'images :debug
pour chaque langue fournit un shell busybox à entrer.
Par exemple:
cd examples/python3/
Modifiez le Dockerfile
pour changer l'image finale pour :debug
:
FROM gcr.io/distroless/python3-debian12:debug
COPY . /app
WORKDIR /app
CMD [ "hello.py" , "/etc" ]
puis construire et lancer avec un point d'entrée de coquille:
$ docker build -t my_debug_image .
$ docker run --entrypoint=sh -ti my_debug_image
/app # ls
BUILD Dockerfile hello.py
Remarque: Si l'image que vous utilisez a déjà une balise, par exemple
gcr.io/distroless/java17-debian12:nonroot
, utilisez la balisedebug-<existing tag>
à la place, par exemplegcr.io/distroless/java17-debian12:debug-nonroot
.
Remarque: LDD n'est pas installé dans l'image de base car c'est un script de shell, vous pouvez le copier ou le télécharger.
Si votre projet utilise la distro, envoyez un PR pour ajouter votre projet ici!