1
votes

Docker Centos, impossible d'exécuter le fichier binaire

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.


0 commentaires

3 Réponses :


0
votes

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.


0 commentaires

0
votes

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.


0 commentaires

2
votes

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:

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

  2. 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é.


7 commentaires

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/…


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?