Table des matières

,

Docker : Contexte de construction de l'image

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 en argument de la commande docker build: c'est le contexte ou build context.

# Dans cet exemple le build context est le répertoire courant '.'
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/

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.

Une bonne pratique consiste à s'assurer que le build context ne contient que les fichiers strictement nécessaires à la création de l'image.

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:

tree -a -L 1 .
.
├── Dockerfile
├── .dockerignore
├── .git
├── noaccess
├── README.txt
└── token.txt

Dans cet exemple le dossier courant est notre build context. Il contient un dossier noaccess sur lequel l'utilisateur courant n'a aucun droit:

ls -ld noaccess/
drwx------ 2 1001 1001 4096 avril 24 19:13 noaccess/

Le dossier noaccess n'est pas nécessaire pour la création de l'image, il est bien exclus par notre fichier .dockerignore

.dockerignore
noaccess
.git
token.txt
.dockerignore

Malgré l'exclusion du dossier “noaccess” par .dockerignore, toute tentative de création de l'image échoue comme illustré ci-dessous:

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

Pour éviter cette erreur deux solutions:

  1. Positionner les droits en lecture seule sur le répertoire et son contenu;
  2. 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