BuildKit et cache avancé
BuildKit est le moteur de build de Docker depuis la version 23 (activé par défaut). Il apporte le parallélisme, les cache mounts persistants, les secrets de build, et le SSH forwarding. Les gains en temps de build peuvent être spectaculaires.
Cache mounts
Les cache mounts persistent entre les builds sur la même machine. Le cache pip, npm, apt, ou go modules n'est jamais re-téléchargé.
# Cache pip entre les builds
FROM python:3.12-slim
RUN --mount=type=cache,target=/root/.cache/pip pip install -r requirements.txt
# Cache apt
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked --mount=type=cache,target=/var/lib/apt,sharing=locked apt-get update && apt-get install -y curl
# Cache Go modules
FROM golang:1.23-alpine
RUN --mount=type=cache,target=/go/pkg/mod --mount=type=cache,target=/root/.cache/go-build go build ./...Ces caches ne sont pas dans les layers de l'image finale. Ils accélèrent les builds sans grossir l'image.
Secrets de build
# Utiliser un secret pendant le build sans le stocker dans les layers
RUN --mount=type=secret,id=npmrc,target=/root/.npmrc npm install
RUN --mount=type=secret,id=gh_token gh auth login --with-token < /run/secrets/gh_tokendocker build --secret id=npmrc,src=$HOME/.npmrc --secret id=gh_token,src=./tokens/github.txt -t myapp:latest .SSH forwarding
# Cloner un dépôt privé pendant le build sans exposer la clé SSH
RUN --mount=type=ssh git clone git@github.com:org/private-repo.git /app/depseval "$(ssh-agent -s)" && ssh-add ~/.ssh/id_ed25519
docker build --ssh default -t myapp:latest .Cache en registry
# Exporter le cache vers un registry
docker build --cache-to type=registry,ref=ghcr.io/org/app:cache,mode=max --cache-from type=registry,ref=ghcr.io/org/app:cache -t ghcr.io/org/app:latest --push .mode=max : cache tous les layers, y compris les intermédiaires. Idéal en CI.
Docker Bake
# docker-bake.hcl — build plusieurs images en parallèle
group "default" {
targets = ["app", "worker", "migrations"]
}
target "app" {
dockerfile = "Dockerfile"
target = "production"
tags = ["ghcr.io/org/app:latest"]
cache-from = ["type=registry,ref=ghcr.io/org/app:cache"]
cache-to = ["type=registry,ref=ghcr.io/org/app:cache,mode=max"]
}
target "worker" {
dockerfile = "Dockerfile"
target = "worker"
tags = ["ghcr.io/org/worker:latest"]
}docker buildx bake --push