Vidéo du talk: https://www.youtube.com/watch?v=kZ2cYyKO0GM
Slides du Meetup Modern Devops Paris du 12/03/2019
https://www.meetup.com/fr-FR/Meetup-Modern-Devops-Paris/events/259466764/
Démo de Julien Crouzet, Señor Architect @eTF1
Optimiser ses builds conteneurs avec BuildKit. Depuis la version 18.09, Docker Engine propose le support de BuildKit. Nous verrons comment l'utiliser pour créer des conteneurs de manière plus rapide, plus optimisée et plus légère.
2. D’abord,
t’es qui ?
Julien CROUZET aka “Poulet”
Señor Architech @ eTF1
Developer Golang, Node.js, C, python, etc.
MAIS PAS JAVA
Mais aussi hipster devops, tahu ?
5. BuildKit ?
• Brique issue de Moby Project (from Docker)
https://mobyproject.org/
• Permet de construire des images en respectant
le format Dockerfile
• Inclus (opt-in) dans Docker 18.09 :
{"features":{"buildkit": true}}
export DOCKER_BUILDKIT=1
8. Concurrent
builds
• Ce qui permet de simplifier l’arbre de décision :
FROM …
RUN …
RUN …
FROM …
RUN …
FROM …
RUN …
CMD …
FROM …
RUN …
RUN …
FROM …
RUN …
CMD …
9. Concurrent
builds
• Et/ou de l’exécuter de manière concurrente :
FROM …
RUN …
RUN …
FROM …
RUN …
FROM …
RUN …
CMD …
FROM …
RUN …
RUN …
FROM …
RUN …
FROM …
RUN …
CMD …
11. Light weighted
build context
• Sans BuildKit, docker build génère un fichier .tar
contenant l’ensemble du répertoire courant
Ce fichier .tar est ensuite envoyé via HTTP POST au
docker engine pour exécuter le build
• Cette opération peut être longue dans le cas de
projets volumineux
Des fichiers inutiles peuvent être transférés
12. Light weighted
build context
• Avec BuildKit, cette opération n’est plus nécéssaire,
désormais les builds sont gérés dans le cadre de
sessions et le contenu n’est envoyé que si nécessaire
Client Engine
HTTP/1.1 POST /build —data context.tar
LEGACY WORKFLOW
13. Light weighted
build context
Client Engine
HTTP/1.1 POST /build
NEW WORKFLOW
HTTP/1.1 POST /session
gRPC read(Dockerfile)
gRPC diff(/go/github.com/project)
15. LLB / Frontends
• Le building d’images a été séparé en deux niveaux :
•LLB: Low-Level Builder, un format binaire
intermédiaire qui permet, entre autres, de créer de
vrais graphes de dépendances.
•Les Frontends, les composants qui prennent en
entrée un format lisible comme un Dockerfile, pour
le convertir en LLB.
16. LLB / Frontends
• LLB :
• Permet une exécution efficiente
• Permet une meilleure gestion du cache
• Laisse le choix sur l’implémentation du builder
(https://github.com/genuinetools/img)
17. LLB / Frontends
• Frontend :
• Permet de créer des formats/syntaxes
• Distribué sous forme d’image
• Exécuté dans un conteneur (modèle Sandbox)
18. New Docker
frontends
• Images fournies par Docker :
https://hub.docker.com/r/docker/dockerfile/tags/
• Header sous la forme :
#syntax=image:tag
=> #syntax=docker/dockerfile:1
• Nouvelles fonctionnalités livrées sous :
docker/dockerfile:experimental
20. Context
mounts
#syntax=docker/dockerfile:1
FROM alpine
COPY ./archive.tgz /files/
RUN tar xfz /files/archive.tgz
RUN rm -f /files/archive.tgz
CMD /files/start.sh
LEGACY
#syntax=docker/dockerfile:experimental
FROM alpine
RUN
—mount=target=./files
tar xfz /files/archive.tgz
CMD /files/start.sh
NEW FRONTEND
22. Cache
mounts
• Docker utilise un nouveau type de stockage,
le Build cache
• Les cache mounts permettent d’utiliser
directement ce stockage pour des builds encore
plus rapide
• Permet de mutualiser le cache entre plusieurs
instances d’un outil de CI/CD
23. Cache
mounts
# syntax = docker/dockerfile:experimental
FROM golang
COPY ...
RUN --mount=type=cache,target=/root/.cache/go-build
go build ...
FROM alpine
RUN --mount=type=cache,target=/var/cache/apk
apk add gcc g++ make
FROM node:alpine
COPY ...
RUN --mount=type=cache,target=/root/.npm
npm install
25. Mais
aussi …
# syntax = docker/dockerfile:experimental
FROM ...
RUN --mount=type=ssh ssh -T git@github.com
## $> DOCKER_BUILDKIT=1 docker build —ssh default -t test .
## ...
## Hi jucrouzet! You've successfully authenticated, but GitHub does not provide shell access.
SSH FORWARDING
26. Mais
aussi …
# syntax = docker/dockerfile:experimental
FROM mesosphere/aws-cli
RUN
—mount=type=secret,id=aws,target=/root/.aws/credentials
aws s3 cp s3://bucket-files/data.tgz .
## $> DOCKER_BUILDKIT=1 docker build
--secret id=aws,src=$HOME/.aws/credentials
-t test .
-t test .
## ...
## Hi jucrouzet! You've successfully authenticated, but GitHub does not provide shell access.
SECRETS
27. That’s all
folks.
Merci !
Des questions, remarques, tomates
?
=> Let’s go
=> Sinon tout à l’heure, autour
d’une bière :)
linkedin.com/in/jucrouzet