2 votes

Python 3.6 dans un conteneur Docker ne démarre pas, mais se plante.

Je sais que ce titre peut prêter à confusion, alors pour clarifier : le conteneur docker démarre très bien. Python continue de planter lorsque j'essaie de l'ouvrir.

Mon ordinateur fonctionne sous Ubunutu. Voici la sortie de uname -a :

Linux work-laptop 4.15.0-39-generic #42-Ubuntu SMP 
Tue Oct 23 15:48:01 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

J'ai un conteneur docker basé sur l'image Python:3.6.3. J'ai également essayé avec les images alpine, jessie, slim et stretch, ainsi qu'avec quelques autres versions 3.6. Elles ont toutes le même problème.

Je lance le conteneur nommé 'nb', et je m'attache à un shell interactif :

docker-compose run nb sh

Le conteneur démarre sans problème, mais lorsque j'essaie d'ouvrir le shell python :

python

Je reçois un étrange message d'erreur :

Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ModuleNotFoundError: No module named 'encodings'

Current thread 0x00007f32546ae700 (most recent call first):
Aborted (core dumped)

J'ai vérifié $PYTHONPATH et $PYTHONHOME, les deux ne sont pas définis.

Ce qui est étrange, c'est que si je spécifie d'utiliser python 2.7 :

python2

le shell démarre sans problème. De même, si j'utilise l'une des images 3.7 et que j'ouvre un shell python 3.7, il n'y a aucun problème. Le problème semble se limiter à la version 3.6.

Les recherches que j'ai effectuées à ce sujet m'indiquent qu'il s'agit probablement d'un problème avec les variables d'environnement. J'ai essayé de définir manuellement PYTHONHOME avec les valeurs suivantes (individuellement)

/usr/local/lib
/usr/local/lib/python
/usr/local/lib/python3.6

sans que le résultat soit modifié. La seule différence est que le message d'erreur ne suggère plus de paramétrer PYTHONHOME

Fatal Python error: Py_Initialize: Unable to get the locale encoding
ModuleNotFoundError: No module named 'encodings'

Current thread 0x00007f32546ae700 (most recent call first):
Aborted (core dumped)

J'ai pensé que le problème pouvait provenir d'une commande dans mon fichier docker, alors j'ai tout supprimé et j'ai lancé une image python non filtrée. Même problème. J'ai retéléchargé, essayé d'autres images, aucun changement. Je ne peux pas imaginer que toutes (ou vraiment aucune) des images python officielles puissent être à l'origine de ce problème, je suppose donc que le problème doit venir de ma machine hôte, mais je ne trouve rien qui touche ce sujet. Des idées ?

2voto

Canadian_Marine Points 305

J'ai trouvé mon problème. J'avais ajouté un montage de volume au fichier docker-compose qui montait un répertoire de projet local dans le répertoire python du conteneur.

volumes:
    - ./nb/python3.6:/usr/local/lib/python3.6

Merci à @EelkevandenBos de m'avoir aidé à réaliser que le problème était limité à docker-compose, et n'était pas présent en utilisant simplement docker. Le problème a été facile à trouver après cela.

J'avais oublié que j'avais fait ça. Mon objectif avec le montage était de limiter le temps passé à télécharger les bibliothèques python, car l'image utilise un certain nombre de bibliothèques assez importantes et chaque fois que vous faites un changement dans la liste des exigences, vous devez retélécharger toutes les bibliothèques. Je pensais qu'en utilisant un volume, les bibliothèques seraient sauvegardées et rechargées même lorsque le conteneur serait reconstruit, ce qui réduirait le temps de téléchargement. Si quelqu'un a une idée sur la façon de faire cela, faites-le moi savoir dans les commentaires.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X