Configurer BuildKit
Si vous créez un builder docker-container
ou kubernetes
avec Buildx, vous pouvez
appliquer une configuration BuildKit personnalisée en passant le
drapeau
--config
à
la commande docker buildx create
.
Miroir de registre
Vous pouvez définir un miroir de registre à utiliser pour vos builds. Cela redirige
BuildKit pour tirer les images d'un nom d'hôte différent. Les étapes suivantes illustrent
la définition d'un miroir pour docker.io
(Docker Hub) vers mirror.gcr.io
.
-
Créez un fichier TOML à l'emplacement
/etc/buildkitd.toml
avec le contenu suivant :debug = true [registry."docker.io"] mirrors = ["mirror.gcr.io"]
Notedebug = true
active les requêtes de débogage dans le démon BuildKit, ce qui enregistre un message qui montre quand un miroir est utilisé. -
Créez un builder
docker-container
qui utilise cette configuration BuildKit :$ docker buildx create --use --bootstrap \ --name mybuilder \ --driver docker-container \ --config /etc/buildkitd.toml
-
Construisez une image :
docker buildx build --load . -f - <<EOF FROM alpine RUN echo "hello world" EOF
Les journaux BuildKit pour ce builder montrent maintenant qu'il utilise le miroir GCR. Vous
pouvez le dire par le fait que les messages de réponse incluent les en-têtes HTTP
x-goog-*
.
$ docker logs buildx_buildkit_mybuilder0
...
time="2022-02-06T17:47:48Z" level=debug msg="do request" request.header.accept="application/vnd.docker.container.image.v1+json, */*" request.header.user-agent=containerd/1.5.8+unknown request.method=GET spanID=9460e5b6e64cec91 traceID=b162d3040ddf86d6614e79c66a01a577
time="2022-02-06T17:47:48Z" level=debug msg="fetch response received" response.header.accept-ranges=bytes response.header.age=1356 response.header.alt-svc="h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"" response.header.cache-control="public, max-age=3600" response.header.content-length=1469 response.header.content-type=application/octet-stream response.header.date="Sun, 06 Feb 2022 17:25:17 GMT" response.header.etag="\"774380abda8f4eae9a149e5d5d3efc83\"" response.header.expires="Sun, 06 Feb 2022 18:25:17 GMT" response.header.last-modified="Wed, 24 Nov 2021 21:07:57 GMT" response.header.server=UploadServer response.header.x-goog-generation=1637788077652182 response.header.x-goog-hash="crc32c=V3DSrg==" response.header.x-goog-hash.1="md5=d0OAq9qPTq6aFJ5dXT78gw==" response.header.x-goog-metageneration=1 response.header.x-goog-storage-class=STANDARD response.header.x-goog-stored-content-encoding=identity response.header.x-goog-stored-content-length=1469 response.header.x-guploader-uploadid=ADPycduqQipVAXc3tzXmTzKQ2gTT6CV736B2J628smtD1iDytEyiYCgvvdD8zz9BT1J1sASUq9pW_ctUyC4B-v2jvhIxnZTlKg response.status="200 OK" spanID=9460e5b6e64cec91 traceID=b162d3040ddf86d6614e79c66a01a577
time="2022-02-06T17:47:48Z" level=debug msg="fetch response received" response.header.accept-ranges=bytes response.header.age=760 response.header.alt-svc="h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"" response.header.cache-control="public, max-age=3600" response.header.content-length=1471 response.header.content-type=application/octet-stream response.header.date="Sun, 06 Feb 2022 17:35:13 GMT" response.header.etag="\"35d688bd15327daafcdb4d4395e616a8\"" response.header.expires="Sun, 06 Feb 2022 18:35:13 GMT" response.header.last-modified="Wed, 24 Nov 2021 21:07:12 GMT" response.header.server=UploadServer response.header.x-goog-generation=1637788032100793 response.header.x-goog-hash="crc32c=aWgRjA==" response.header.x-goog-hash.1="md5=NdaIvRUyfar8201DleYWqA==" response.header.x-goog-metageneration=1 response.header.x-goog-storage-class=STANDARD response.header.x-goog-stored-content-encoding=identity response.header.x-goog-stored-content-length=1471 response.header.x-guploader-uploadid=ADPycdtR-gJYwC7yHquIkJWFFG8FovDySvtmRnZBqlO3yVDanBXh_VqKYt400yhuf0XbQ3ZMB9IZV2vlcyHezn_Pu3a1SMMtiw response.status="200 OK" spanID=9460e5b6e64cec91 traceID=b162d3040ddf86d6614e79c66a01a577
time="2022-02-06T17:47:48Z" level=debug msg=fetch spanID=9460e5b6e64cec91 traceID=b162d3040ddf86d6614e79c66a01a577
time="2022-02-06T17:47:48Z" level=debug msg=fetch spanID=9460e5b6e64cec91 traceID=b162d3040ddf86d6614e79c66a01a577
time="2022-02-06T17:47:48Z" level=debug msg=fetch spanID=9460e5b6e64cec91 traceID=b162d3040ddf86d6614e79c66a01a577
time="2022-02-06T17:47:48Z" level=debug msg=fetch spanID=9460e5b6e64cec91 traceID=b162d3040ddf86d6614e79c66a01a577
time="2022-02-06T17:47:48Z" level=debug msg="do request" request.header.accept="application/vnd.docker.image.rootfs.diff.tar.gzip, */*" request.header.user-agent=containerd/1.5.8+unknown request.method=GET spanID=9460e5b6e64cec91 traceID=b162d3040ddf86d6614e79c66a01a577
time="2022-02-06T17:47:48Z" level=debug msg="fetch response received" response.header.accept-ranges=bytes response.header.age=1356 response.header.alt-svc="h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"" response.header.cache-control="public, max-age=3600" response.header.content-length=2818413 response.header.content-type=application/octet-stream response.header.date="Sun, 06 Feb 2022 17:25:17 GMT" response.header.etag="\"1d55e7be5a77c4a908ad11bc33ebea1c\"" response.header.expires="Sun, 06 Feb 2022 18:25:17 GMT" response.header.last-modified="Wed, 24 Nov 2021 21:07:06 GMT" response.header.server=UploadServer response.header.x-goog-generation=1637788026431708 response.header.x-goog-hash="crc32c=ZojF+g==" response.header.x-goog-hash.1="md5=HVXnvlp3xKkIrRG8M+vqHA==" response.header.x-goog-metageneration=1 response.header.x-goog-storage-class=STANDARD response.header.x-goog-stored-content-encoding=identity response.header.x-goog-stored-content-length=2818413 response.header.x-guploader-uploadid=ADPycdsebqxiTBJqZ0bv9zBigjFxgQydD2ESZSkKchpE0ILlN9Ibko3C5r4fJTJ4UR9ddp-UBd-2v_4eRpZ8Yo2llW_j4k8WhQ response.status="200 OK" spanID=9460e5b6e64cec91 traceID=b162d3040ddf86d6614e79c66a01a577
...
Définition des certificats de registre
Si vous spécifiez des certificats de registre dans la configuration de BuildKit, le démon
copie les fichiers dans le conteneur sous /etc/buildkit/certs
. Les étapes suivantes
montrent l'ajout d'un certificat de registre auto-signé à la configuration de BuildKit.
-
Ajoutez la configuration suivante à
/etc/buildkitd.toml
:# /etc/buildkitd.toml debug = true [registry."myregistry.com"] ca=["/etc/certs/myregistry.pem"] [[registry."myregistry.com".keypair]] key="/etc/certs/myregistry_key.pem" cert="/etc/certs/myregistry_cert.pem"
Cela indique au builder de pousser les images vers le registre
myregistry.com
en utilisant les certificats à l'emplacement spécifié (/etc/certs
). -
Créez un builder
docker-container
qui utilise cette configuration :$ docker buildx create --use --bootstrap \ --name mybuilder \ --driver docker-container \ --config /etc/buildkitd.toml
-
Inspectez le fichier de configuration du builder (
/etc/buildkit/buildkitd.toml
), il montre que la configuration du certificat est maintenant configurée dans le builder.$ docker exec -it buildx_buildkit_mybuilder0 cat /etc/buildkit/buildkitd.toml
debug = true [registry] [registry."myregistry.com"] ca = ["/etc/buildkit/certs/myregistry.com/myregistry.pem"] [[registry."myregistry.com".keypair]] cert = "/etc/buildkit/certs/myregistry.com/myregistry_cert.pem" key = "/etc/buildkit/certs/myregistry.com/myregistry_key.pem"
-
Vérifiez que les certificats sont à l'intérieur du conteneur :
$ docker exec -it buildx_buildkit_mybuilder0 ls /etc/buildkit/certs/myregistry.com/ myregistry.pem myregistry_cert.pem myregistry_key.pem
Vous pouvez maintenant pousser vers le registre en utilisant ce builder, et il s'authentifiera en utilisant les certificats :
$ docker buildx build --push --tag myregistry.com/myimage:latest .
Réseau CNI
Le réseau CNI pour les builders peut être utile pour gérer la contention des ports réseau lors de builds concurrents. CNI n'est pas encore disponible dans l'image BuildKit par défaut. Mais vous pouvez créer votre propre image qui inclut le support CNI.
L'exemple de Dockerfile suivant montre une image BuildKit personnalisée avec le support CNI. Il utilise la configuration CNI pour les tests d'intégration dans BuildKit comme exemple. N'hésitez pas à inclure votre propre configuration CNI.
# syntax=docker/dockerfile:1
ARG BUILDKIT_VERSION=v0.22.0
ARG CNI_VERSION=v1.0.1
FROM --platform=$BUILDPLATFORM alpine AS cni-plugins
RUN apk add --no-cache curl
ARG CNI_VERSION
ARG TARGETOS
ARG TARGETARCH
WORKDIR /opt/cni/bin
RUN curl -Ls https://github.com/containernetworking/plugins/releases/download/$CNI_VERSION/cni-plugins-$TARGETOS-$TARGETARCH-$CNI_VERSION.tgz | tar xzv
FROM moby/buildkit:${BUILDKIT_VERSION}
ARG BUILDKIT_VERSION
RUN apk add --no-cache iptables
COPY --from=cni-plugins /opt/cni/bin /opt/cni/bin
ADD https://raw.githubusercontent.com/moby/buildkit/${BUILDKIT_VERSION}/hack/fixtures/cni.json /etc/buildkit/cni.json
Maintenant, vous pouvez construire cette image, et créer une instance de builder à partir d'elle en utilisant
l'option --driver-opt image
:
$ docker buildx build --tag buildkit-cni:local --load .
$ docker buildx create --use --bootstrap \
--name mybuilder \
--driver docker-container \
--driver-opt "image=buildkit-cni:local" \
--buildkitd-flags "--oci-worker-net=cni"
Limitation des ressources
Parallélisme maximal
Vous pouvez limiter le parallélisme du solveur BuildKit, ce qui est particulièrement utile
pour les machines peu puissantes, en utilisant une configuration BuildKit
lors de la création d'un builder avec les
drapeaux --config
.
# /etc/buildkitd.toml
[worker.oci]
max-parallelism = 4
Maintenant, vous pouvez
créer un builder docker-container
qui utilisera cette configuration BuildKit pour limiter le parallélisme.
$ docker buildx create --use \
--name mybuilder \
--driver docker-container \
--config /etc/buildkitd.toml
Limite de connexion TCP
Les connexions TCP sont limitées à 4 connexions simultanées par registre pour tirer et pousser des images, plus une connexion supplémentaire dédiée aux requêtes de métadonnées. Cette limite de connexion empêche votre build de se bloquer lors du tirage d'images. La connexion de métadonnées dédiée aide à réduire le temps de build global.
Plus d'informations : moby/buildkit#2259