Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| sysadmin:docker:creer_image [2021/02/01 21:51] – modification externe 127.0.0.1 | sysadmin:docker:creer_image [2023/04/25 12:11] (Version actuelle) – yoann | ||
|---|---|---|---|
| Ligne 29: | Ligne 29: | ||
| </ | </ | ||
| - | Pour construire l' | + | ===== Construire une image ===== |
| + | |||
| + | Pour construire l' | ||
| < | < | ||
| - | docker image build -t [imagename][: | + | docker image build -t [imagename][: |
| </ | </ | ||
| - | L' | + | * La commande accepte un seul argument obligatoire (ici " |
| + | * L' | ||
| + | |||
| + | |||
| + | ==== A propos du contexte ===== | ||
| + | |||
| + | L' | ||
| + | |||
| + | ==== Exemple ==== | ||
| Dans l' | Dans l' | ||
| Ligne 47: | Ligne 57: | ||
| </ | </ | ||
| - | La variable APP_VERSION non définie dans le script sera présente dans l’environnement. On souhaite partir d'une image de busybox existante pour y ajouter notre script | + | La variable APP_VERSION non définie dans le script sera présente dans l’environnement |
| <file txt Dockerfile> | <file txt Dockerfile> | ||
| Ligne 59: | Ligne 69: | ||
| <code bash> | <code bash> | ||
| - | docker image build --tag test_script: | + | docker image build --tag test_script: |
| </ | </ | ||
| On peut ensuite créer le conteneur à partir de notre image: | On peut ensuite créer le conteneur à partir de notre image: | ||
| <code bash> | <code bash> | ||
| - | docker container run --detach --env APP_VERSION=" | + | docker container run --detach --env APP_VERSION=" |
| </ | </ | ||
| - | ===== Taille des images ===== | ||
| - | Chaque instruction modifiant la structure du système de fichier dans le Dockerfile produit un layer (calque). Un nombre important de layers conduit à une image de taille importante et peu nuire au temps d' | + | |
| + | ===== Optimiser la taille des images ===== | ||
| + | |||
| + | Chaque instruction modifiant la structure du système de fichier dans le Dockerfile produit un layer (calque). Un nombre important de layers conduit à une image de taille importante et peu nuire au temps d' | ||
| Ci dessous un exemple non optimisé: | Ci dessous un exemple non optimisé: | ||
| + | |||
| < | < | ||
| # layer 1 | # layer 1 | ||
| Ligne 128: | Ligne 141: | ||
| && rm -rf / | && rm -rf / | ||
| </ | </ | ||
| + | |||
| + | < | ||
| + | Depuis les versions 17.09 et supérieures de Docker les commandes COPY/ADD supportent le modificateur **%%--chown%%**. Cela permet d' | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | # Pour l' | ||
| + | mkdir test | ||
| + | cd test | ||
| + | dd if=/ | ||
| + | </ | ||
| + | |||
| + | Pour illustrer la problématique on va utiliser une image busybox d'une taille initiale approximative de 1 Mo | ||
| + | <code bash> | ||
| + | # Pour lister les images locales | ||
| + | docker images | ||
| + | REPOSITORY | ||
| + | phobos/ | ||
| + | grafana/ | ||
| + | bitnami/ | ||
| + | traefik | ||
| + | ... | ||
| + | busybox | ||
| + | </ | ||
| + | |||
| + | On crée un **Dockerfile** pour notre nouveau conteneur basé sur une image busybox à laquelle on ajoute notre fichier de données de 10 Mo: | ||
| + | <file Dockerfile> | ||
| + | FROM busybox: | ||
| + | COPY file.dat / | ||
| + | ... | ||
| + | </ | ||
| + | |||
| + | On crée l' | ||
| + | <code bash> | ||
| + | docker image build -t phobos/ | ||
| + | </ | ||
| + | |||
| + | Si on affiche à présent les images disponibles: | ||
| + | <code bash> | ||
| + | docker images | ||
| + | REPOSITORY | ||
| + | phobos/ | ||
| + | ... | ||
| + | busybox | ||
| + | </ | ||
| + | |||
| + | Comme on pouvait s'y attendre la taille de notre nouvelle image correspond à l' | ||
| + | |||
| + | Le phénomène des calques apparaîtra avec la modification suivante dans le Dockerfile: | ||
| + | <file Dockerfile> | ||
| + | FROM busybox: | ||
| + | COPY file.dat / | ||
| + | # Pour nos besoins le fichier doit appartenir à l' | ||
| + | RUN chown 1003:1003 / | ||
| + | </ | ||
| + | |||
| + | <code bash> | ||
| + | # création de l' | ||
| + | docker image build -t phobos/ | ||
| + | |||
| + | # lister les images | ||
| + | docker images | ||
| + | REPOSITORY | ||
| + | phobos/ | ||
| + | phobos/ | ||
| + | ... | ||
| + | busybox | ||
| + | </ | ||
| + | |||
| + | Ici on voit bien qu' | ||
| + | |||
| + | Pour éviter de créer un nouveau calque et doubler l' | ||
| + | |||
| + | <file dockerfile Dockerfile> | ||
| + | FROM busybox: | ||
| + | COPY --chown=1003: | ||
| + | </ | ||
| + | |||
| + | On crée une nouvelle version avec le Dockerfile modifié | ||
| + | <code bash> | ||
| + | # création de l' | ||
| + | docker image build -t phobos/ | ||
| + | |||
| + | # lister les images | ||
| + | docker images | ||
| + | REPOSITORY | ||
| + | phobos/ | ||
| + | phobos/ | ||
| + | phobos/ | ||
| + | ... | ||
| + | busybox | ||
| + | </ | ||
| + | |||
| + | La version v1.2 obtenue avec la dernière version du Dockerfile n'a pas produit de nouveau calque, on a bien une taille de 11.7Mo pour notre image. | ||
| ===== Sécurité ===== | ===== Sécurité ===== | ||
| - | Limiter au maximum les processus s' | + | Limiter au maximum les processus s’exécutant |
| + | |||
| + | ===== Utilisation des labels ===== | ||
| + | |||
| + | Docker permet d' | ||
| + | * Un label est une paire clé/valeur stockée dans une chaîne de caractères. | ||
| + | * Les noms de labels commencent et se terminent par des lettres minuscules. Ils ne peuvent contenir que des lettre et les caractères point ' | ||
| + | * La clé du label doit être unique, si elle est définie plusieurs fois, c'est la dernière déclaration qui est conservée. Les labels peuvent ainsi être hérités/ | ||
| + | * Pour éviter les conflits ou redéfinitions involontaires des clés, il est recommandé d' | ||
| + | |||
| + | Confère la [[https:// | ||
| + | |||
| + | Il existe également un projet **OCI** ((**O**pen **C**ontainer **I**nitiative)) | ||
| + | * https:// | ||
| + | |||
| + | |||
| + | <file Dockerfile> | ||
| + | # metadata | ||
| + | LABEL " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | </ | ||
| + | |||
| + | ===== Références ===== | ||
| + | |||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||