Outils pour utilisateurs

Outils du site


sysadmin:docker:creer_image

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
sysadmin:docker:creer_image [2021/08/16 19:31] yoannsysadmin:docker:creer_image [2023/04/25 12:11] (Version actuelle) yoann
Ligne 29: Ligne 29:
 </file> </file>
  
-Pour construire l'image on utilisera la commande:+===== Construire une image ===== 
 + 
 +Pour construire l'image on utilisera la commande **image build** ou **build**:
  
 <code> <code>
-docker image build -t [imagename][:tag] [Dockerfile folder]+docker image build -t [imagename][:tag] aContextFolder
 </code> </code>
  
-L'option --tag, -t permet de définir le nom de l'image.+  * La commande accepte un seul argument obligatoire (ici "aContextFolder"), c'est le chemin du ''build context''; 
 +  * L'option %%--tag%%, -t permet de définir à la fois le nom de l'image et la version. 
 + 
 + 
 +==== A propos du contexte ===== 
 + 
 +L'image Docker est construite côté serveur. Le client Docker communique au serveur le ''Dockerfile et les fichiers présents dans le dossier en argument de la commande **docker build**'': c'est le contexte. Il est possible d'exclure des fichiers du contexte grâce au fichier **.dockerignore**. Le détail du fonctionnement du contexte est abordé dans le wiki [[sysadmin/docker/build_context|build context]]. 
 + 
 +==== Exemple ====
  
 Dans l'exemple ci-dessous, on a écrit un fichier script.sh qui affiche régulièrement un message: Dans l'exemple ci-dessous, on a écrit un fichier script.sh qui affiche régulièrement un message:
Ligne 47: Ligne 57:
 </file> </file>
  
-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 d'exécution. On souhaite partir d'une image de busybox existante pour y ajouter notre script 
  
 <file txt Dockerfile> <file txt Dockerfile>
Ligne 59: Ligne 69:
  
 <code bash> <code bash>
-docker image build --tag test_script:0.1.1 .+docker image build --tag test_script:v0.1.1 .
 </code> </code>
  
 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="0.1" test_script:0.1.1+docker container run --detach --env APP_VERSION="0.1" test_script:v0.1.1
 </code> </code>
  
-===== 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'accès de lecture/écriture. Pour éviter cela on groupe au maximum les commandes:+ 
 +===== 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'accès de lecture/écriture. Pour éviter cela on groupe au maximum les commandes.
  
 Ci dessous un exemple non optimisé: Ci dessous un exemple non optimisé:
 +
 <file> <file>
 # layer 1 # layer 1
Ligne 128: Ligne 141:
     && rm -rf /var/lib/apt/lists/* /root/.cpan* /lutim/local/cache/* /lufi/utilities     && rm -rf /var/lib/apt/lists/* /root/.cpan* /lutim/local/cache/* /lufi/utilities
 </file> </file>
 +
 +<note>
 +Depuis les versions 17.09 et supérieures de Docker les commandes COPY/ADD supportent le modificateur **%%--chown%%**. Cela permet d'éviter la création d'un calque supplémentaire lorsqu'une commande de changement de droits d'accès au fichier est enchaînée après la copie.
 +</note>
 +
 +<code>
 +# Pour l'exemple on crée un fichier de 10 Mo que l'on va ajouter à une image
 +mkdir test
 +cd test
 +dd if=/dev/zero of=file.dat bs=1M count=10
 +</code>
 +
 +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               TAG             IMAGE ID       CREATED         SIZE
 +phobos/buildenv-ffsync   v1.0            5335d8ff969e   6 weeks ago     144MB
 +grafana/grafana          8.1.1           c6e5c4f48cf9   7 weeks ago     213MB
 +bitnami/dokuwiki         latest          1f0bc8445e43   2 months ago    387MB
 +traefik                  v2.4.12         8b7f6bb63b8a   2 months ago    92MB
 +...
 +busybox                  latest          22667f53682a   8 months ago    1.23MB
 +</code>
 +
 +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:latest
 +COPY file.dat /opt/file.dat
 +...
 +</file>
 +
 +On crée l'image à partir de ce Dockerfile:
 +<code bash>
 +docker image build -t phobos/layer-test:v1.0 .
 +</code>
 +
 +Si on affiche à présent les images disponibles:
 +<code bash>
 +docker images
 +REPOSITORY               TAG             IMAGE ID       CREATED          SIZE
 +phobos/layer-test        v1.0            53be48f115d7   17 seconds ago   11.7MB
 +...
 +busybox                  latest          22667f53682a   8 months ago     1.23MB
 +</code>
 +
 +Comme on pouvait s'y attendre la taille de notre nouvelle image correspond à l'image initiale busybox à laquelle on ajoute le poids de notre fichier de données.
 +
 +Le phénomène des calques apparaîtra avec la modification suivante dans le Dockerfile:
 +<file Dockerfile>
 +FROM busybox:latest
 +COPY file.dat /opt/file.dat
 +# Pour nos besoins le fichier doit appartenir à l'utilisateur 1003
 +RUN chown 1003:1003 /opt/file.dat
 +</file>
 +
 +<code bash>
 +# création de l'image
 +docker image build -t phobos/layer-test:v1.1 .
 +
 +# lister les images
 +docker images
 +REPOSITORY               TAG             IMAGE ID       CREATED              SIZE
 +phobos/layer-test        v1.1            776d428be3b6   About a minute ago   22.2MB
 +phobos/layer-test        v1.0            53be48f115d7   10 minutes ago       11.7MB
 +...
 +busybox                  latest          22667f53682a   8 months ago         1.23MB
 +</code>
 +
 +Ici on voit bien qu'entre les versions v1.0 et v1.1, la taille de l'image a doublé alors qu'aucun nouveau fichier n'a été ajouté à l'image. L'opération de changement de droits a conduit à un nouveau calque contenant le même fichier de 10 Mo avec les droits adéquats.
 +
 +Pour éviter de créer un nouveau calque et doubler l'occupation disque on peut modifier le Dockerfile comme ci-dessous:
 +
 +<file dockerfile Dockerfile>
 +FROM busybox:latest
 +COPY --chown=1003:1003 file.dat /opt/file.dat
 +</file>
 +
 +On crée une nouvelle version avec le Dockerfile modifié
 +<code bash>
 +# création de l'image
 +docker image build -t phobos/layer-test:v1.2 .
 +
 +# lister les images
 +docker images
 +REPOSITORY               TAG             IMAGE ID       CREATED          SIZE
 +phobos/layer-test        v1.2            72ca2ea7cac0   5 seconds ago    11.7MB
 +phobos/layer-test        v1.1            776d428be3b6   37 minutes ago   22.2MB
 +phobos/layer-test        v1.0            53be48f115d7   47 minutes ago   11.7MB
 +...
 +busybox                  latest          22667f53682a   8 months ago     1.23MB
 +</code>
 +
 +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'executant en tant que root meme dans le container. Utiliser exec, su-exec pour remplacer dès que possible les processus root.+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 ===== ===== Utilisation des labels =====
Ligne 159: Ligne 266:
  
   * https://adilsoncarvalho.com/use-labels-on-your-docker-images-3abe4477e9f5   * https://adilsoncarvalho.com/use-labels-on-your-docker-images-3abe4477e9f5
 +  * https://www.fosstechnix.com/dockerfile-instructions/
 +  * https://vsupalov.com/docker-arg-env-variable-guide/
sysadmin/docker/creer_image.1629142293.txt.gz · Dernière modification : 2021/08/16 19:31 de yoann