Une image Docker amd64 qui ne fonctionne pas sur Mac ne doit pas être attribuée automatiquement à Rosetta : vérifiez d’abord la plateforme de l’image, essayez l’arm64 si elle existe, puis réservez l’émulation à une validation courte. Si l’expérience dépend d’un binaire x86 impossible à reconstruire, conservez un nœud x86 ; un Mac Apple Silicon distant sert alors à valider la branche arm64 et macOS, pas à remplacer ce nœud.

Ce guide s’adresse au doctorant qui doit relancer l’image fournie avec un article, au développeur scientifique qui doit livrer le même environnement aux utilisateurs x86 et arm64, ainsi qu’au responsable informatique qui répartit les tâches entre Mac distant, serveur x86 et environnement à double voie.

Diagnostic initial de l’image Docker amd64 sur Mac

Le premier piège est de confondre trois niveaux différents :

  • l’image peut afficher un avertissement de plateforme, tout en démarrant correctement ;
  • le conteneur peut démarrer, mais le programme scientifique peut échouer ;
  • le programme peut s’exécuter, mais produire un résultat différent ou incomplet.

Ces niveaux exigent des preuves différentes. Un message indiquant que l’image linux/amd64 ne correspond pas à l’hôte linux/arm64 signale une différence d’architecture. Il ne prouve pas encore que l’expérience est inutilisable.

Commencez par relever l’architecture de l’hôte :

uname -m

Sur un Mac Apple Silicon, le système hôte peut être arm64. Le conteneur, lui, fonctionne dans l’environnement Linux virtualisé fourni par Docker Desktop. Vérifiez ensuite les plateformes annoncées par l’image :

docker buildx imagetools inspect IMAGE:TAG

La commande d’inspection permet de distinguer une image unique, souvent limitée à linux/amd64, d’une image multi-architecture qui annonce aussi linux/arm64. Le fonctionnement des manifestes et la sélection automatique d’une variante sont expliqués dans la documentation officielle sur les images Docker multi-plateformes.

Enfin, contrôlez la plateforme réellement utilisée par le conteneur :

docker image inspect IMAGE:TAG \
  --format '{{.Os}}/{{.Architecture}}'

docker run --rm --platform=linux/amd64 IMAGE:TAG uname -m

Cette dernière commande ne valide pas votre logiciel scientifique. Elle confirme uniquement la route d’exécution choisie. L’acceptation doit également couvrir l’entrée du programme, une donnée d’essai, le fichier de sortie et le format attendu.

Apple Silicon Mac : pourquoi un avertissement de plateforme apparaît-il ?

Parce que l’image demandée est souvent publiée uniquement pour linux/amd64, alors que votre Mac utilise Apple Silicon. Docker peut alors tenter de faire fonctionner le binaire x86 dans une machine Linux arm64 avec une couche de traduction. Lorsque l’image contient une variante arm64, Docker peut sélectionner cette variante automatiquement selon le manifeste et la plateforme demandée. Les paramètres de docker run, notamment --platform, sont décrits dans la référence officielle de docker run.

Le diagnostic initial doit donc produire quatre éléments traçables :

  1. l’architecture du Mac ;
  2. le contenu du manifeste de l’image ;
  3. la plateforme effective du conteneur ;
  4. le résultat d’un échantillon scientifique représentatif.

Attention : supprimer un avertissement en ajoutant systématiquement --platform=linux/amd64 n’est pas une réparation. Vous avez seulement imposé une voie d’exécution ; il reste à démontrer que le programme, ses bibliothèques natives et ses résultats sont corrects.

Symptômes de téléchargement et d’entrée du conteneur

Un échec lors du téléchargement donne une information différente d’un exec format error. Dans le premier cas, Docker peut ne pas trouver une variante correspondant à la plateforme demandée, ou le registre peut ne fournir que l’architecture x86. Dans le second cas, l’entrée lancée dans le conteneur est souvent un exécutable incompatible avec la plateforme effective.

Inspectez d’abord l’entrée déclarée par l’image :

docker image inspect IMAGE:TAG \
  --format '{{json .Config.Entrypoint}} {{json .Config.Cmd}}'

Puis exécutez une commande minimale avec la plateforme explicitement choisie :

docker run --rm --platform=linux/amd64 IMAGE:TAG /bin/sh -c 'uname -m'

Si cette commande fonctionne mais que l’entrée habituelle déclenche exec format error, recherchez un script ou un binaire ajouté pendant la construction. Un script shell peut lui-même appeler une extension compilée pour une autre architecture. L’erreur n’est donc pas nécessairement située dans l’image de base.

Une image uniquement linux/amd64 peut-elle fonctionner sur un Mac M ?

Oui, elle peut parfois fonctionner par émulation, mais cette possibilité ne constitue pas une garantie de reproductibilité. Elle dépend de l’émulateur, du gestionnaire de machine virtuelle, des appels système utilisés et des dépendances natives du programme. Utilisez cette voie pour ouvrir l’environnement, comparer un petit résultat ou confirmer qu’une migration est envisageable.

Ne la retenez pas automatiquement pour une analyse longue, une compilation fréquente ou une chaîne qui doit être livrée à toute une équipe. Le critère de passage n’est pas « le conteneur reste lancé », mais plutôt :

  • l’entrée scientifique est acceptée ;
  • le programme principal termine sans erreur ;
  • les fichiers produits existent et sont lisibles ;
  • les versions de dépendances sont enregistrées ;
  • un résultat de référence est retrouvé avec une tolérance documentée.

La présence de amd64 dans le nom d’une image ne suffit pas non plus à expliquer son comportement. L’image globale, son système de base, son interpréteur et chacune de ses extensions peuvent avoir des architectures différentes.

Bibliothèques natives et erreurs d’exécution

Lorsque le conteneur démarre puis s’arrête pendant l’analyse, examinez les journaux complets avant de réinstaller Python, R ou Java. Une réinstallation aveugle peut masquer l’origine et modifier les versions utilisées par l’article ou le protocole.

Conservez la sortie de la commande de lancement :

docker run --rm \
  --platform=linux/amd64 \
  IMAGE:TAG \
  programme --version

Pour Python, inspectez les modules qui contiennent du code compilé. Pour R, vérifiez les paquets comportant des bibliothèques partagées. Pour Java, recherchez les bibliothèques JNI ou les outils natifs appelés par le paquet. Dans tous les cas, le point important est de séparer :

  • l’architecture déclarée par l’image ;
  • l’architecture de la base utilisée au premier stade ;
  • l’architecture des dépendances téléchargées ;
  • l’architecture des extensions compilées pendant le build.

Un environnement de bio-informatique, d’audio scientifique ou de traitement vidéo peut embarquer des codecs, des accélérateurs ou des outils hérités dont le nom ne révèle pas la plateforme. Une commande de version réussie ne prouve donc pas que l’étape de calcul fonctionnera.

Que faire après un exec format error dans un conteneur ?

Commencez par identifier le fichier lancé au moment exact de l’erreur et sa plateforme. Vérifiez ensuite l’architecture du conteneur avec uname -m, inspectez l’image et relancez une commande minimale. Si l’image ne fournit que linux/amd64, forcez cette plateforme uniquement pour confirmer l’hypothèse.

Si l’erreur persiste, cherchez un exécutable copié depuis votre machine, un artefact produit sur une autre plateforme ou une extension installée par téléchargement direct. Si le composant est exclusivement x86 et ne possède aucune alternative arm64, arrêtez la migration forcée. Le choix rationnel devient un nœud x86 ou une double chaîne documentée.

Utilisez ensuite un échantillon de données anonymisé. Il doit être suffisamment petit pour faciliter le diagnostic, mais conserver la dépendance critique : fichier audio, image, séquence génomique, données tabulaires ou modèle de calcul. Comparez le résultat, le format de sortie et les messages d’erreur, pas uniquement le code de retour.

Construction émulée et blocages de Buildx

Une construction qui semble figée peut être lente sans être bloquée. Les téléchargements de couches, la compilation d’extensions, les tests et la traduction d’instructions x86 n’ont pas la même cause. Notez l’étape précise qui ne progresse plus et relancez la construction avec une sortie détaillée :

docker buildx build \
  --platform=linux/amd64 \
  --progress=plain \
  -t laboratoire/test:amd64 .

Vérifiez également les plateformes annoncées par le constructeur :

docker buildx ls
docker buildx inspect --bootstrap

La documentation de Docker Buildx sur le paramètre --platform décrit le ciblage des plateformes. Les variables TARGETPLATFORM et TARGETARCH, utiles lorsqu’un Dockerfile doit produire plusieurs variantes, sont détaillées dans la documentation des variables de build.

Ne déduisez pas une panne à partir du seul temps d’attente. Distinguez :

  • une couche qui se télécharge encore ;
  • une compilation active ;
  • un test qui attend un service ;
  • une erreur de réseau ;
  • une boucle ou un blocage réel dans le build.

Le gestionnaire de machine virtuelle sélectionné dans Docker Desktop compte ici. Les fonctions disponibles ne sont pas identiques selon le backend. La documentation officielle des gestionnaires de machine virtuelle Docker Desktop indique notamment que Docker VMM ne prend actuellement pas en charge l’accélération Rosetta. Ne présentez donc pas Rosetta comme une capacité universelle de Docker Desktop.

Expérience de terrain : une compilation lente et une incompatibilité scientifique ne se prouvent pas de la même façon. Avant de changer de backend, sauvegardez le journal, le Dockerfile, le nom du constructeur Buildx et la plateforme demandée. Vous pourrez alors reproduire le test sur un nœud x86 sans perdre la trace de la différence.

Reconstruction multi-architecture

La solution durable consiste à traiter l’architecture comme une propriété de la chaîne de livraison, et non comme une option ajoutée au dernier moment. Commencez par le Dockerfile. Recherchez les images de base explicitement verrouillées sur une plateforme :

FROM --platform=linux/amd64 image-base:tag

Une telle instruction peut empêcher une construction multi-architecture ou provoquer un avertissement. Docker documente cette règle dans le contrôle FromPlatformFlagConstDisallowed.

Préférez, lorsque le projet le permet, une base publiée pour plusieurs architectures. Utilisez ensuite les variables de ciblage dans les étapes qui téléchargent un outil ou choisissent un paquet :

ARG TARGETPLATFORM
ARG TARGETARCH

RUN echo "construction pour ${TARGETPLATFORM}, architecture ${TARGETARCH}"

La procédure de migration suit une séquence stricte :

  1. inventoriez les images de base et leur manifeste ;
  2. repérez les téléchargements de binaires précompilés ;
  3. remplacez les URL ou paquets codés en dur pour x86 ;
  4. compilez les extensions dans la plateforme cible ;
  5. construisez séparément les variantes linux/amd64 et linux/arm64 ;
  6. publiez un manifeste multi-architecture ;
  7. testez chaque variante avec le même échantillon scientifique.

Une reconstruction réussie ne signifie pas que les deux architectures produiront des octets identiques. Les bibliothèques numériques peuvent employer des instructions différentes, l’ordre des opérations peut varier et certains calculs parallèles peuvent modifier les derniers chiffres. Définissez donc à l’avance le critère scientifique : égalité exacte, tolérance numérique, même classement, même fichier final ou même qualité audio/vidéo.

Dans le Dockerfile, évitez de choisir une plateforme en fonction de l’architecture de la machine qui construit l’image. La cible doit être explicite au niveau du build, tandis que les dépendances doivent être résolues pour cette cible. Un Dockerfile qui fonctionne uniquement sur le poste de son auteur est un risque de maintenance pour le laboratoire.

Matrice de décision pour le laboratoire

La décision ne se résume pas à « Mac ou serveur ». Elle dépend de ce que votre expérience doit prouver.

Option À choisir si Validation minimale Limite principale
Image arm64 native sur Mac Apple Silicon Une variante arm64 existe et les dépendances critiques sont disponibles Échantillon, résultat, versions et sortie comparés à la référence Certains outils x86 peuvent manquer
Image amd64 émulée sur Mac Vous devez confirmer rapidement la faisabilité ou reproduire une étape courte Entrée, programme principal, résultat et journaux contrôlés Émulation non adaptée à tous les calculs ou builds
Reconstruction multi-architecture Vous livrez l’environnement à des utilisateurs x86 et arm64 Deux builds, deux exécutions, même protocole de comparaison Demande un inventaire précis des dépendances
Nœud x86 natif Un composant propriétaire ou binaire ne peut pas être porté Résultat de référence et journal complet conservés Ne valide pas le comportement arm64 ou macOS
Double voie Mac arm64 et x86 Le projet doit publier, tester et reproduire sur plusieurs plateformes Registre des manifestes, commits, plateformes et résultats Plus de maintenance et davantage de cas à documenter

Cette matrice évite deux décisions coûteuses. La première consiste à maintenir indéfiniment une émulation lente alors qu’une image arm64 pourrait être reconstruite. La seconde consiste à migrer un calcul x86 non portable vers un Mac, puis à attribuer les écarts de résultat à la seule plateforme.

Pour un besoin ponctuel, vous pouvez tester un Mac distant pour une validation arm64. Le contrôle à distance est utile pour installer les dépendances, lancer Docker Desktop, vérifier une chaîne graphique ou comparer un résultat sans acheter immédiatement une machine. Si la validation confirme la présence d’un composant x86 indispensable, revenez au nœud x86 plutôt que de présenter la location comme une solution universelle.

Livraison et traçabilité scientifique

Une image portant uniquement un tag, comme latest, n’est pas une preuve suffisante. Le même tag peut être déplacé, recevoir une autre variante ou être résolu différemment selon l’hôte. Pour chaque exécution remise à un étudiant ou à une équipe, consignez :

  • le nom et le digest de l’image ;
  • les plateformes présentes dans le manifeste ;
  • le commit du Dockerfile ;
  • la version de Docker Desktop utilisée ;
  • le constructeur Buildx ;
  • la plateforme réellement exécutée ;
  • les versions de Python, R, Java ou des outils natifs ;
  • le jeu de données de validation ;
  • le résultat attendu et la tolérance admise.

La documentation sur le réseau et la virtualisation de Docker Desktop sur Mac doit également être consultée lorsque le programme contacte un service externe, un registre privé ou une base de données du laboratoire. Un résultat différent peut venir du réseau, d’un montage de volume ou d’une permission, et non de l’architecture du processeur.

Pour les tâches audio et vidéo, ajoutez une vérification des codecs et du rendu final. Pour la bio-informatique, conservez le rapport de versions et un fichier de sortie représentatif. Pour la modélisation ou l’analyse statistique, définissez une tolérance avant de comparer les résultats. Cette discipline empêche de déclarer une migration réussie parce que le conteneur s’est simplement lancé.

Si vous devez travailler sans Mac local, consultez aussi les options de Mac mini distant pour des essais scientifiques et de compatibilité. L’objectif est de vérifier une hypothèse arm64 ou macOS avec un accès administrateur complet, puis de décider rationnellement si votre protocole justifie une ressource permanente.

Choix final entre Mac, x86 et double voie

La meilleure organisation dépend du résultat du diagnostic :

  • choisissez l’arm64 natif si l’image existe dans cette variante et que l’échantillon scientifique correspond à la référence ;
  • utilisez l’amd64 émulé pour une preuve courte, une inspection ou une transition contrôlée ;
  • reconstruisez en multi-architecture si vous maîtrisez les dépendances et devez livrer les deux plateformes ;
  • conservez le nœud x86 lorsqu’un binaire propriétaire, une extension ou une chaîne de calcul ne peut pas être porté ;
  • adoptez la double voie lorsque la compatibilité arm64 doit être vérifiée sans abandonner la reproductibilité historique x86.

Un Mac Apple Silicon distant est particulièrement pertinent pour valider une branche arm64, une interface macOS, une chaîne de développement ou un outil audio/vidéo qui n’est pas disponible dans votre laboratoire Linux. Il ne remplace pas un serveur x86 lorsque le calcul dépend réellement d’instructions, de pilotes ou de binaires x86 non remplaçables.

Le choix entre votre solution actuelle et un Mac distant doit donc rester concret. Un poste Windows ou Linux peut manquer de macOS, imposer une configuration locale difficile à partager et retarder la validation arm64. Un serveur x86, lui, reproduit bien l’ancien environnement mais ne révèle pas les défauts de portage vers Apple Silicon. Dans ce cadre, louer temporairement un Mac auprès de MACCOME peut offrir une étape de contrôle plus propre : vous testez l’image, les dépendances et les résultats avant d’engager le budget du laboratoire.

En revanche, si votre projet exige un calcul x86 intensif et stable, un accès physique à des périphériques particuliers ou une exécution permanente sans couche d’émulation, gardez le nœud x86. Le Mac loué est alors un banc d’essai pour la compatibilité arm64 et macOS, non un substitut à toute l’infrastructure scientifique.