Compilar extensiones multiarquitectura
Se recomienda encarecidamente que, como mínimo, tu extensión sea compatible con las siguientes arquitecturas:
linux/amd64linux/arm64
Docker Desktop obtiene la imagen de la extensión de acuerdo con la arquitectura del sistema del usuario. Si la extensión no proporciona una imagen que coincida con la arquitectura del sistema del usuario, Docker Desktop no podrá instalar la extensión. Como resultado, los usuarios no podrán ejecutar la extensión en Docker Desktop.
Compilar y subir (push) para múltiples arquitecturas
Si creaste una extensión a partir del comando docker extension init, el archivo Makefile en la raíz del directorio incluye un objetivo (target) con el nombre push-extension.
Puedes ejecutar make push-extension para compilar tu extensión tanto para las plataformas linux/amd64 como linux/arm64 y subirlas a Docker Hub.
Por ejemplo:
$ make push-extension
Alternativamente, si comenzaste desde un directorio vacío, utiliza el comando a continuación para compilar tu extensión para múltiples arquitecturas:
$ docker buildx build --push --platform=linux/amd64,linux/arm64 --tag=username/my-extension:0.0.1 .
Luego puedes verificar el manifiesto de la imagen para ver si está disponible para ambas arquitecturas utilizando el
comando docker buildx imagetools:
$ docker buildx imagetools inspect username/my-extension:0.0.1
Name: docker.io/username/my-extension:0.0.1
MediaType: application/vnd.docker.distribution.manifest.list.v2+json
Digest: sha256:f3b552e65508d9203b46db507bb121f1b644e53a22f851185d8e53d873417c48
Manifests:
Name: docker.io/username/my-extension:0.0.1@sha256:71d7ecf3cd12d9a99e73ef448bf63ae12751fe3a436a007cb0969f0dc4184c8c
MediaType: application/vnd.docker.distribution.manifest.v2+json
Platform: linux/amd64
Name: docker.io/username/my-extension:0.0.1@sha256:5ba4ceea65579fdd1181dfa103cc437d8e19d87239683cf5040e633211387ccf
MediaType: application/vnd.docker.distribution.manifest.v2+json
Platform: linux/arm64
TipSi tienes problemas al subir la imagen, asegúrate de haber iniciado sesión en Docker Hub. De lo contrario, ejecuta
docker loginpara autenticarte.
Para obtener más información, consulta la página Imágenes multiplataforma.
Añadir binarios multiarquitectura
Si tu extensión incluye algunos binarios que se despliegan en el host, es importante que también tengan la arquitectura correcta cuando compiles la extensión para múltiples arquitecturas.
Actualmente, Docker no proporciona una forma de especificar explícitamente múltiples binarios para cada arquitectura en el archivo metadata.json. Sin embargo, puedes añadir binarios específicos para cada arquitectura dependiendo de la variable TARGETARCH en el Dockerfile de la extensión.
El siguiente ejemplo muestra una extensión que utiliza un binario como parte de sus operaciones. La extensión necesita ejecutarse tanto en Docker Desktop para Mac como para Windows.
En el Dockerfile, descarga el binario dependiendo de la arquitectura de destino:
#syntax=docker/dockerfile:1.3-labs
FROM alpine AS dl
WORKDIR /tmp
RUN apk add --no-cache curl tar
ARG TARGETARCH
RUN <<EOT ash
mkdir -p /out/darwin
curl -fSsLo /out/darwin/kubectl "https://dl.k8s.io/release/$(curl -Ls https://dl.k8s.io/release/stable.txt)/bin/darwin/${TARGETARCH}/kubectl"
chmod a+x /out/darwin/kubectl
EOT
RUN <<EOT ash
if [ "amd64" = "$TARGETARCH" ]; then
mkdir -p /out/windows
curl -fSsLo /out/windows/kubectl.exe "https://dl.k8s.io/release/$(curl -Ls https://dl.k8s.io/release/stable.txt)/bin/windows/amd64/kubectl.exe"
fi
EOT
FROM alpine
LABEL org.opencontainers.image.title="example-extension" \
org.opencontainers.image.description="My Example Extension" \
org.opencontainers.image.vendor="Docker Inc." \
com.docker.desktop.extension.api.version=">= 0.3.3"
COPY --from=dl /out /En el archivo metadata.json, especifica la ruta de cada binario en cada plataforma:
{
"icon": "docker.svg",
"ui": {
"dashboard-tab": {
"title": "Example Extension",
"src": "index.html",
"root": "ui"
}
},
"host": {
"binaries": [
{
"darwin": [
{
"path": "/darwin/kubectl"
}
],
"windows": [
{
"path": "/windows/kubectl.exe"
}
]
}
]
}
}Como resultado, cuando TARGETARCH es igual a:
arm64, el binario dekubectlque se descarga corresponde a la arquitecturaarm64y se copia en/darwin/kubectlen la etapa final.amd64, se descargan dos binarios dekubectl. Uno para Darwin y otro para Windows. Se copian en/darwin/kubectly/windows/kubectl.exerespectivamente en la etapa final.
NoteLa ruta de destino del binario para Darwin es
darwin/kubectlen ambos casos. El único cambio es el binario específico de la arquitectura que se descarga.
Cuando se instala la extensión, el framework de la extensión copia los binarios de la imagen de la extensión en /darwin/kubectl para Darwin, o en /windows/kubectl.exe para Windows, a una ubicación específica en el sistema de archivos del host del usuario.
¿Puedo desarrollar extensiones que ejecuten contenedores de Windows?
Aunque Docker Extensions es compatible con Docker Desktop para Windows, Mac y Linux, el framework de la extensión solo admite contenedores Linux. Por lo tanto, debes apuntar a linux como sistema operativo (OS) cuando compiles la imagen de tu extensión.