04/12/2022

1. BuildKit

Lu 439 fois Licence Creative Commons

Description

Docker BuildKit est un backend pour la construction d'image, plus performant que le moteur d'origine.
Il apporte de nombreuses améliorations de performances lors de la construction d'images (amélioration du cache, parallélisation de stages, ...), mais également quelques fonctionnalités comme les frontends dont certaines versions apportent de nouvelles syntaxes:

# syntax=docker/dockerfile:1.4
# la ligne ci-dessus indique le frontend à utiliser

...

# Ci-dessous est utilisé la syntaxe HereDoc qui nous évite les nombreux "\" en fin de ligne
RUN <<EOF
    apk add --no-cache bash git supervisor
    chown -R www-data:www-data ./var
EOF

# Voir également RUN --mount, RUN --network, ...

Note: les concepts de backend et frontend n'existe que depuis l'apparition de BuildKit.

Que vous souhaitiez utiliser les nouvelles fonctionnalités et syntaxes de BuildKit ou non, il est fortement recommandé de l'utiliser pour améliorer les performances de construction et ainsi obtenir une meilleure expérience dans votre CI ou simplement en tant que développeur.

Utilisation

Si vous utilisez une version récente de Docker il y a de fortes chances pour que BuildKit soit déjà activé !
Si c'est le cas, l'output de la commande docker build est différent des précédents exemples de ce cours:

docker build -t mon-app:latest .
[output][+] Building 47.6s (17/29)
[output] => [internal] load build definition from Dockerfile                                                         0.0s
[output] => => transferring dockerfile: 1.86kB                                                                           0.0s
[output] => [internal] load .dockerignore                                                                                    0.0s
[output] => => transferring context: 34B                                                                                   0.0s
[output] => resolve image config for docker.io/docker/dockerfile:1.3-labs                                  0.7s
[output] => CACHED docker-image://docker.io/docker/dockerfile:1.3-labs@sha256:250...          0.0s
[output] => [internal] load build definition from Dockerfile                                                         0.0s
[output] => [internal] load .dockerignore                                                                                    0.0s
[output] => [internal] load metadata for docker.io/mlocati/php-extension-installer:1.5.19         0.6s
[output] => [internal] load metadata for docker.io/library/php:8.1.6-fpm-alpine3.15                 0.5s
[output] => [internal] load metadata for docker.io/library/composer:2.3.5                                 0.0s
[output] => [stage_app  1/17] FROM docker.io/library/php:8.1.6-fpm-alpine3.15@sha2...          0.0s
[output] => [php_ext_installer 1/1] FROM docker.io/mlocati/php-extension-installer:1.5...          0.0s
[output] => [composer 1/1] FROM docker.io/library/composer:2.3.5                                           0.0s
[output] => [internal] load build context                                                                                     0.1s
[output] => => transferring context: 1.53MB                                                                             0.1s
[output] => CACHED [stage_app  2/17] WORKDIR /srv/app                                                         0.0s
[output] => CACHED [stage_app  3/17] COPY --from=composer /usr/bin/composer /usr/bin/     0.0s
[output] => CACHED [stage_app  4/17] COPY --from=php_ext_installer /usr/bin/install-...          0.0s
[output]...

Sinon il est possible d'activer BuildKit en définissant la variable DOCKER_BUILDKIT avec la valeur 1, dans votre profil shell ou simplement devant une commande:

DOCKER_BUILDKIT=1 docker build ...

De manière plus permanente, on peut l'activer dans la configuration du daemon Docker (le fichier daemon.json):

{
    "features": {
        "buildkit" : true
    }
}