Outils pour utilisateurs

Outils du site


sysadmin:docker:build_context

Différences

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

Lien vers cette vue comparative

sysadmin:docker:build_context [2023/04/25 10:24] – créée yoannsysadmin:docker:build_context [2023/04/25 14:49] (Version actuelle) yoann
Ligne 6: Ligne 6:
 Docker est une application client-serveur, les versions respectives du client et du serveur (daemon) sont visible via la commande **docker version**. Docker est une application client-serveur, les versions respectives du client et du serveur (daemon) sont visible via la commande **docker version**.
  
-La création d'une nouvelle image est une opération qui s'effectue côté serveur. Le client Docker communique le Dokerfile ainsi que tous les fichiers présents dans le répertoire d'exécution de la commande **docker build**: c'est le contexte ou build context.+La création d'une nouvelle image est une opération qui s'effectue côté serveur. Le client Docker communique le Dokerfile ainsi que tous les fichiers présents dans le répertoire en argument de la commande **docker build**: c'est le contexte ou build context.
  
 <code bash> <code bash>
-Construction d'une image à partir du Dockerfile dans le répertoire courant +Dans cet exemple le build context est le répertoire courant '.'
-# Le build context est le répertoire courant '.' +
 docker build -t "phobos/myapp:v0.11" . docker build -t "phobos/myapp:v0.11" .
 +
 +# Ici le buid context est le sous répertoire ./bc/
 +docker build -t "phobos/myapp:v0.11" ./bc/
 +
 +# Le Dokerfile doit être présent à la racine du build context.
 +# Si ce n'est pas le cas ou si le nom est différent l'option -f
 +# permet de définir le chemin du Dokerfile
 +docker build -t "phobos/myapp:v0.11" -f ./MyDockerfile ./bc/
 </code> </code>
  
-Il est possible d'exclure une partie des fichiers du contexte via le fichier **.dockerignore**. Cette exclusion permet d'optimiser la taille de l'archive que le client Docker communique au serveur et de+===== Exclure des fichiers du build context ===== 
 + 
 +Il est possible d'exclure une partie des fichiers présents dans le répertoire de contexte via le fichier **.dockerignore**.  
 + 
 +<note> 
 +Une bonne pratique consiste à s'assurer que le build context ne contient que les fichiers strictement nécessaires à la création de l'image. 
 +</note> 
 + 
 + 
 + 
 +===== Dépannage ===== 
 + 
 +==== Error checking context: can't stat ... ==== 
 + 
 +Les dossiers présents dans le build context doivent être accessibles à l'utilisateur en lecture même s'ils sont exclus par le fichier .dockerignore 
 + 
 +Ce comportement peut surprendre. Il est illustré ci-dessous: 
 + 
 +<code bash> 
 +tree -a -L 1 . 
 +
 +├── Dockerfile 
 +├── .dockerignore 
 +├── .git 
 +├── noaccess 
 +├── README.txt 
 +└── token.txt 
 +</code> 
 + 
 +Dans cet exemple le dossier courant est notre build context. Il contient un dossier ''noaccess'' sur lequel l'utilisateur courant n'a aucun droit: 
 + 
 +<code bash> 
 +ls -ld noaccess/ 
 +drwx------ 2 1001 1001 4096 avril 24 19:13 noaccess/ 
 +</code> 
 + 
 +Le dossier noaccess n'est pas nécessaire pour la création de l'image, il est bien exclus par notre fichier .dockerignore  
 + 
 +<file txt .dockerignore> 
 +noaccess 
 +.git 
 +token.txt 
 +.dockerignore 
 +</file> 
 + 
 +Malgré l'exclusion du dossier "noaccess" par .dockerignore, toute tentative de création de l'image échoue comme illustré ci-dessous: 
 + 
 +<code bash> 
 +docker build -t "phobos/buildtest:v0.1"
 +[+] Building 0.1s (2/2) FINISHED                                                                                                                                       
 + => ERROR [internal] load build definition from Dockerfile                                                                                                       0.1s 
 + => => transferring dockerfile: 72B                                                                                                                              0.0s 
 + => ERROR [internal] load .dockerignore                                                                                                                          0.0s 
 + => => transferring context: 68B                                                                                                                                 0.0s 
 +------ 
 + > [internal] load build definition from Dockerfile: 
 +------ 
 +------ 
 + > [internal] load .dockerignore: 
 +------ 
 +failed to solve with frontend dockerfile.v0: failed to read dockerfile: error from sender: open noaccess: permission denied 
 +</code>
  
 +Pour éviter cette erreur deux solutions:
 +  - Positionner les droits en lecture seule sur le répertoire et son contenu;
 +  - Créer un sous répertoire pour le build context ne contenant pas des dossiers non accessibles.
  
 +Ici on fait le choix de créer un répertoire dédié pour le build context:
 + 
 ===== Références ===== ===== Références =====
  
   * https://medium.com/containers-101/docker-tutorials-2e31a513de61   * https://medium.com/containers-101/docker-tutorials-2e31a513de61
sysadmin/docker/build_context.1682418256.txt.gz · Dernière modification : 2023/04/25 10:24 de yoann