Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révisionLes deux révisions suivantes |
technique:docker:general:quemu_cross_running [2021/01/22 11:45] – [QEMU dans Docker : le meilleur des 2 mondes] gblond | technique:docker:general:quemu_cross_running [2021/01/22 13:38] – [QEMU dans Docker : le meilleur des 2 mondes] gblond |
---|
mask ffffffffffffff00fffffffffffffffffeffffff | mask ffffffffffffff00fffffffffffffffffeffffff |
</code> | </code> |
| |
| Cette méthode a l'avantage de ne pas nécessiter d'installer des paquets supplémentaires sur la machine hôte. Mais tout ce qui suit est tout-à-fait valable si vous avez installé qemu en global (''apt install qemu-user-static''). |
| |
### Exécuter un conteneur d’une architecture incompatible | ### Exécuter un conteneur d’une architecture incompatible |
| |
Comme indiqué dans l'introduction, ici rien ne change, on peut utiliser docker normalement. Enfin presque, car docker sélectionnera toujours l'architecture hôte pour une image disponible avec plusieurs architecture. Il n'y a malheureusement pas à ce jour de solution pour forcer docker à utiliser une architecture spécifique. Cette fonctionnalité existe pourtant dans d'autres outils, comme skopeo. | Comme indiqué dans l'introduction, ici rien ne change, on peut utiliser docker normalement. Enfin presque, car docker sélectionnera toujours l'architecture hôte pour une image disponible avec plusieurs architecture. Pour sélectionner l'architecture voulue, il faut utiliser l'option ''--platform=linux/arm64''. À ce jour (docker v19.03.13), cette option n'est disponible que en [[https://docs.docker.com/engine/reference/commandline/dockerd/#description | mode experimental]]. |
| |
Voici un exemple d'exécution : | Voici un exemple d'exécution : |
| |
<code> | <code> |
$ uname -a | $ uname -a |
</code> | </code> |
| |
<bootnote information> | <bootnote> |
Si vous obtenez l'erreur | Si vous obtenez l'erreur |
| |
standard_init_linux.go:211: exec user process caused "exec format error" | standard_init_linux.go:211: exec user process caused "exec format error" |
</code> | </code> |
c’est que vous avez oublié d'installer qemu ! | c’est que vous avez oublié de configurer qemu ! |
</bootnote> | </bootnote> |
| |
</code> | </code> |
| |
<bootnote note> | De même, il est possible d'utiliser l'option ''--platform=linux/arm64'' dans l'instruction ''FROM'' si docker est en mode experimental. |
| |
| <bootnote important> |
| Suivant les clients dockers, il est possible que l'architecture indiquée dans l'image ne corresponde pas à celle réelle ; dans ce cas vous pourriez par mégarde écraser une image de l'architecture hôte au moment de pousser l'image sur un serveur multi-arch ! |
| |
| Pour connaître l'architecture que docker a associé avec une image, on peut utiliser la commande suivante : |
| |
| <code bash> |
| $ docker inspect test_docker | grep Architecture |
| "Architecture": "arm64", |
| </code> |
| |
| </bootnote> |
| |
| <bootnote> |
En théorie, rien ne vous interdit de copier un binaire d'une architecture A dans une image d'une architecture B. Cependant, vous ne pourrez pas l'exécuter, même si qemu est configuré sur la machine hôte. | En théorie, rien ne vous interdit de copier un binaire d'une architecture A dans une image d'une architecture B. Cependant, vous ne pourrez pas l'exécuter, même si qemu est configuré sur la machine hôte. |
</bootnote> | </bootnote> |