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/
Il est possible d'exclure une partie des fichiers présents dans le répertoire de contexte via le fichier .dockerignore.
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
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:
Ici on fait le choix de créer un répertoire dédié pour le build context: