Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| sysadmin:docker:creer_image [2020/11/29 11:54] – créée yoann | 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=" |
| </ | </ | ||
| + | |||
| + | |||
| + | ===== 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é: | ||
| + | |||
| + | < | ||
| + | # layer 1 | ||
| + | RUN apt-get update && apt-get install -y --no-install-recommends --no-install-suggests perl \ | ||
| + | ca-certificates \ | ||
| + | shared-mime-info \ | ||
| + | perlmagick \ | ||
| + | make \ | ||
| + | gcc \ | ||
| + | ca-certificates \ | ||
| + | libssl-dev \ | ||
| + | git | ||
| + | # layer 2 | ||
| + | RUN cpan install Carton | ||
| + | |||
| + | # layer 3 | ||
| + | RUN cd / && git clone https:// | ||
| + | |||
| + | # layer 4 | ||
| + | RUN cd /lutim && carton install | ||
| + | |||
| + | # layer 5 | ||
| + | RUN apt-get purge -y make gcc ca-certificates libssl-dev git | ||
| + | |||
| + | # layer 6 | ||
| + | RUN apt-get autoremove --purge -y && apt-get clean | ||
| + | |||
| + | #layer 7 | ||
| + | RUN rm -rf / | ||
| + | </ | ||
| + | |||
| + | Les mêmes commandes regroupées conduiront à la création d'un seul calque: | ||
| + | < | ||
| + | RUN apt-get update \ | ||
| + | && apt-get install -y --no-install-recommends --no-install-suggests perl \ | ||
| + | ca-certificates \ | ||
| + | shared-mime-info \ | ||
| + | perlmagick \ | ||
| + | make \ | ||
| + | gcc \ | ||
| + | ca-certificates \ | ||
| + | libssl-dev \ | ||
| + | git \ | ||
| + | && cpan install Carton \ | ||
| + | && cd / \ | ||
| + | && git clone https:// | ||
| + | && cd /lutim \ | ||
| + | && carton install \ | ||
| + | && apt-get purge -y make \ | ||
| + | gcc \ | ||
| + | ca-certificates \ | ||
| + | libssl-dev \ | ||
| + | git \ | ||
| + | && apt-get autoremove --purge -y \ | ||
| + | && apt-get clean \ | ||
| + | && 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é ===== | ||
| + | |||
| + | Limiter au maximum les processus s’exécutant en tant que root même dans le container. Utiliser exec, su-exec pour remplacer dès que possible les processus root. | ||
| + | |||
| + | ===== 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:// | ||