J'ai un binaire C ++
qui fonctionne correctement sur les centos
locaux. Récemment, j'ai commencé à apprendre docker
et à essayer d'exécuter mon application C ++
sur centos docker
.
Premièrement, j'ai extrait centos: latest
du docker hub et installé mon application C ++
dessus et elle a fonctionné avec succès, sans aucun problème. Maintenant, j'ai installé docker sur raspberry-pi et tiré à nouveau centos et j'ai essayé d'exécuter la même application dessus, mais cela m'a donné une erreur.
bash: impossible d'exécuter le fichier binaire
Habituellement, cette erreur survient lorsque nous essayons d'exécuter une application sur une architecture différente de celle sur laquelle elle est construite. J'ai vérifié cat etc / centos-release
sur raspberry-pi et le résultat est CentOS Linux version 7.6.1810 (AltArch)
, où le résultat sur les centos locaux est CentOS Linux version 7.6.1810 (Core)
uname -a
sur les deux appareils est comme suit
raspberry-pi, centos docker Linux c475f349e7c2 4.14.79-v7 + # 1159 SMP Sun 4 novembre 17:50:20 GMT 2018 armv7l armv7l armv7l GNU / Linux
centos, centos docker Linux a57f3fc2c1a6 4.15.0-46-generic # 49-Ubuntu SMP mercredi 6 février 09:33:07 UTC 2019 x86_64 x86_64 x86_64 GNU / Linux
MODIFIER:
Aussi, file myapplication
TTCHAIN: exécutable ELF 64 bits LSB, x86-64, version 1 (GNU / Linux), lié dynamiquement, interpréteur / lib64 / l, pour GNU / Linux 2.6.24, BuildID [sha1] = 287b501c8206893f7819f215ee0033586212b143 , avec debug_info, non dépouillé
Ma question est de savoir comment puis-je exécuter la même application native de centos, extraite de docker sur le modèle raspberry-pi 3.
3 Réponses :
Peut-être que vous essayez d'exécuter un binaire 64 bits sur un processeur 32 bits, vous auriez besoin de plus d'informations pour en être sûr.
Vous pouvez vérifier en utilisant la commande file
dans le shell. Vous devrez peut-être recompiler sur le système d'origine avec l'indicateur -m32
vers gcc.
Veuillez faire un "uname -a" sur les deux appareils et publier les résultats.
Le type de processeur ou de bibliothèque ne correspond probablement pas.
Je suppose (j'espère) que vous n'essayez pas d'exécuter une application compilée x86 sur un Pi. Bien que Docker soit disponible pour les deux types de processeurs, Docker n'exécutera pas de binaires x86 sur Pi ou vice versa.
En fait, AltArch signifie actuellement l'une des architectures suivantes ... ppc64, ppc64le, i386, armhfp (arm v7 32 bits), aarch64 (arm v8 64 bits). Core suggère les versions grand public x86 et x86_64 de CentOS.
Oui, je parie que c'est ce que c'est ... vous ne pouvez pas simplement transférer un binaire x86 vers un Raspbian et vous attendre à ce que cela fonctionne. L'application doit être reconstruite pour la plate-forme.
Votre application a été conçue pour x86-64. Les binaires Intel x86-64 NE PEUVENT PAS fonctionner sur un processeur ARM.
Vous avez deux voies à suivre:
Si vous n'avez pas de code source pour l'application, vous aurez besoin d'un émulateur x86-64 qui fonctionnera sur votre Raspberry Pi. Compte tenu des capacités moindres du Pi et de la propension d'Intel à poursuivre quiconque crée un émulateur pour ses processeurs, je doute que vous en trouviez un qui soit accessible au public.
Si vous avez le code source de l'application, vous devez le reconstruire en tant qu'exécutable Raspberry Pi. Vous semblez savoir qu'il a été écrit en C ++. GCC et d'autres chaînes d'outils sont disponibles pour le Raspberry Pi (très probablement un "yum install gcc" sur votre Pi récupérera le compilateur et les outils pour vous). La construction de l'application devrait être extrêmement similaire à la construction de celle-ci pour x86_64.
Vous pourriez trouver un compilateur croisé qui vous permettrait de construire pour le Pi à partir de votre boîte x86_64, mais cela peut devenir compliqué.
J'ai construit l'application pour raspberryi-pi, mais l'application est trop grande pour être traitée sur raspberry-pi, c'est pourquoi j'allais utiliser docker, pour l'utiliser comme processus, mais il semble que ce n'est pas une bonne voie.
Vous pouvez trouver cela intéressant ... hackaday.com/2016/09/01/... GIYF (Google est votre ami) pour cela ... Je préfère DuckDuckGo, mais vous comprenez. Il existe de nombreux articles concernant la configuration d'une compilation croisée.
Encore mieux ... techsparx.com/software-development/… a>
J'ai fait une compilation croisée et un développement sur raspberry-pi aussi mais quand mon application démarre, elle a besoin de presque 3g de mémoire mais raspberry-pi n'a que 1G disponible, donc je reçois toujours une erreur de segmentation> j'ai essayé cela avec la compilation croisée aussi et avec sur la compilation raspberry-pi également. Je doute que cela fonctionne même avec docker, mais j'ai pensé que cela pouvait être un bon moyen pour moi d'apprendre le docker. Merci
De plus, j'ai essayé swap
mais mon application a quand même planté au démarrage.
De plus, je n'ai pas besoin de docker pour configurer la configuration de la compilation croisée, je ne peux utiliser que les chaînes d'outils disponibles pour la compilation croisée et j'ai fait une compilation croisée de cette façon, mais je voulais juste connaître et apprendre le docker.
Ce que je me demande à propos de docker, c'est que le dossier est une sorte de VM, donc peu importe le système d'exploitation qui s'exécute à l'intérieur du conteneur, pourquoi il exécute 'armv7 centos', pourquoi pas l'image / le conteneur x86_64?