⚠️ Traduction non officielle - Cette documentation est une traduction communautaire non officielle de Docker.

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
Tip

Si 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 binaire kubectl récupéré correspond à l'architecture arm64, et est copié vers /darwin/kubectl dans l'étape finale.
  • amd64, deux binaires kubectl 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.
Note

Le 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.