Publicité

[Meetup] Optimiser ses builds Docker avec BuildKit.

Señor Architect / Developer à eTF1
13 Mar 2019
Publicité

Contenu connexe

Publicité

[Meetup] Optimiser ses builds Docker avec BuildKit.

  1. Optimiser le build des images avec BuildKit
  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 ?
  3. Fun Fact !
  4. BuildKit ?
  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
  6. BuildKit ? • Testable dès aujourd’hui dans docker :
  7. Concurrent builds • Le parsing et l’exécution des Dockerfile sont désormais inversés : AVAN T APRE S
  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 …
  10. Concurrent builds
  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)
  14. Light weighted build context
  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
  19. Context mounts • Permet d’utiliser un montage de répertoire, directement lors du build • Moins de layers • Builds plus rapides
  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
  21. Context mounts
  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
  24. Cache mounts
  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
Publicité