Créer des extensions multi-architecture
Il est fortement recommandé qu'au minimum, votre extension soit supportée pour les architectures suivantes :
linux/amd64
linux/arm64
Docker Desktop récupère l'image d'extension selon l'architecture système de l'utilisateur. Si l'extension ne fournit pas d'image qui correspond à l'architecture système de l'utilisateur, Docker Desktop n'est pas capable d'installer l'extension. En conséquence, les utilisateurs ne peuvent pas exécuter l'extension dans Docker Desktop.
Construire et pousser pour plusieurs architectures
Si vous avez créé une extension avec la commande docker extension init
, le Makefile
à la racine du répertoire inclut une cible avec le nom push-extension
.
Vous pouvez exécuter make push-extension
pour construire votre extension contre les plateformes linux/amd64
et linux/arm64
, et les pousser vers Docker Hub.
Par exemple :
$ make push-extension
Alternativement, si vous avez commencé depuis un répertoire vide, utilisez la commande ci-dessous pour construire votre extension pour plusieurs architectures :
$ docker buildx build --push --platform=linux/amd64,linux/arm64 --tag=username/my-extension:0.0.1 .
Vous pouvez ensuite vérifier le manifeste d'image pour voir si l'image est disponible pour les deux architectures en utilisant la
commande 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 vous avez des difficultés à pousser l'image, assurez-vous d'être connecté à Docker Hub. Sinon, exécutez
docker login
pour vous authentifier.
Pour plus d'informations, voir la page Images multi-plateformes.
Ajouter des binaires multi-architecture
Si votre extension inclut des binaires qui se déploient sur l'hôte, il est important qu'ils aient aussi la bonne architecture lors de la construction de l'extension contre plusieurs architectures.
Actuellement, Docker ne fournit pas de moyen de spécifier explicitement plusieurs binaires pour chaque architecture dans le fichier metadata.json
. Cependant, vous pouvez ajouter des binaires spécifiques à l'architecture selon le TARGETARCH
dans le Dockerfile
de l'extension.
L'exemple suivant montre une extension qui utilise un binaire dans le cadre de ses opérations. L'extension doit fonctionner à la fois dans Docker Desktop pour Mac et Windows.
Dans le Dockerfile
, téléchargez le binaire selon l'architecture cible :
#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 /
Dans le fichier metadata.json
, spécifiez le chemin pour chaque binaire sur chaque plateforme :
{
"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"
}
]
}
]
}
}
En conséquence, quand TARGETARCH
égale :
arm64
, le binairekubectl
récupéré correspond à l'architecturearm64
, et est copié vers/darwin/kubectl
dans l'étape finale.amd64
, deux binaireskubectl
sont récupérés. Un pour Darwin et un autre pour Windows. Ils sont copiés vers/darwin/kubectl
et/windows/kubectl.exe
respectivement, dans l'étape finale.
NoteLe chemin de destination du binaire pour Darwin est
darwin/kubectl
dans les deux cas. Le seul changement est le binaire spécifique à l'architecture qui est téléchargé.
Quand l'extension est installée, le framework d'extension copie les binaires depuis l'image d'extension à /darwin/kubectl
pour Darwin, ou /windows/kubectl.exe
pour Windows, vers un emplacement spécifique dans le système de fichiers hôte de l'utilisateur.
Puis-je développer des extensions qui exécutent des conteneurs Windows ?
Bien que les Extensions Docker soient supportées sur Docker Desktop pour Windows, Mac et Linux, le framework d'extension ne supporte que les conteneurs Linux. Par conséquent, vous devez cibler linux
comme OS quand vous construisez votre image d'extension.