Configurar BuildKit
Si creas un builder docker-container o kubernetes con Buildx, puedes
aplicar una configuración de BuildKit personalizada pasando la
opción --buildkitd-config
al comando docker buildx create.
Espejo de registro (Registry mirror)
Puedes definir un espejo de registro (registry mirror) para usarlo en tus compilaciones.
Al hacerlo, se redirige a BuildKit para descargar imágenes desde un nombre de host diferente. Los siguientes pasos ejemplifican
cómo definir un espejo para docker.io (Docker Hub) hacia mirror.gcr.io.
Crea un archivo TOML en
/etc/buildkitd.tomlcon el siguiente contenido:debug = true [registry."docker.io"] mirrors = ["mirror.gcr.io"]Notedebug = trueactiva las solicitudes de depuración en el demonio de BuildKit, lo que registra un mensaje que muestra cuándo se está utilizando un espejo.Crea un builder
docker-containerque utilice esta configuración de BuildKit:$ docker buildx create --use --bootstrap \ --name mybuilder \ --driver docker-container \ --buildkitd-config /etc/buildkitd.tomlCompila una imagen:
docker buildx build --load . -f - <<EOF FROM alpine RUN echo "hello world" EOF
Los registros de BuildKit para este builder ahora muestran que utiliza el espejo de GCR. Puedes
saberlo por el hecho de que los mensajes de respuesta incluyen las cabeceras 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
...Configuración de certificados de registro
Si especificas certificados de registro en la configuración de BuildKit, el demonio
copia los archivos dentro del contenedor bajo /etc/buildkit/certs. Los siguientes
pasos muestran cómo añadir un certificado de registro autofirmado a la configuración de BuildKit.
Añade la siguiente configuración a
/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"Esto le indica al builder que suba las imágenes al registro
myregistry.comutilizando los certificados en la ubicación especificada (/etc/certs).Crea un builder
docker-containerque utilice esta configuración:$ docker buildx create --use --bootstrap \ --name mybuilder \ --driver docker-container \ --buildkitd-config /etc/buildkitd.tomlInspecciona el archivo de configuración del builder (
/etc/buildkit/buildkitd.toml), este muestra que la configuración de certificados ahora está aplicada en el builder.$ docker exec -it buildx_buildkit_mybuilder0 cat /etc/buildkit/buildkitd.tomldebug = 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"Verifica que los certificados estén dentro del contenedor:
$ docker exec -it buildx_buildkit_mybuilder0 ls /etc/buildkit/certs/myregistry.com/ myregistry.pem myregistry_cert.pem myregistry_key.pem
Ahora puedes subir (push) al registro utilizando este builder, y este se autenticará utilizando los certificados:
$ docker buildx build --push --tag myregistry.com/myimage:latest .
Redes CNI (CNI networking)
Las redes CNI para builders pueden ser útiles para lidiar con el conflicto (contención) de puertos de red durante compilaciones concurrentes. CNI aún no está disponible en la imagen predeterminada de BuildKit. Sin embargo, puedes crear tu propia imagen que incluya soporte para CNI.
El siguiente ejemplo de Dockerfile muestra una imagen de BuildKit personalizada con soporte para CNI. Utiliza la configuración CNI para pruebas de integración en BuildKit como ejemplo. Siéntete libre de incluir tu propia configuración CNI.
# syntax=docker/dockerfile:1
ARG BUILDKIT_VERSION=v0.28.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.jsonAhora puedes compilar esta imagen y crear una instancia de builder a partir de ella utilizando
la opción --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"
Limitación de recursos
Paralelismo máximo
Puedes limitar el paralelismo del solucionador (solver) de BuildKit, lo cual es particularmente útil
para máquinas de baja potencia, utilizando una configuración de BuildKit
al crear un builder con la
opción --buildkitd-config.
# /etc/buildkitd.toml
[worker.oci]
max-parallelism = 4Ahora puedes
crear un builder docker-container
que utilizará esta configuración de BuildKit para limitar el paralelismo.
$ docker buildx create --use \
--name mybuilder \
--driver docker-container \
--buildkitd-config /etc/buildkitd.toml
Límite de conexiones TCP
Las conexiones TCP están limitadas a 4 conexiones simultáneas por registro para descargar y subir imágenes, más una conexión adicional dedicada para las solicitudes de metadatos. Este límite de conexiones evita que tu compilación se quede atascada mientras descarga imágenes. La conexión dedicada a los metadatos ayuda a reducir el tiempo total de la compilación.
Más información: moby/buildkit#2259