Écart entre deux hôtes exécutant les mêmes commandes docker
Un collègue et moi avons un gros puzzle Docker.
Lorsque nous exécutons les commandes suivantes, nous obtenons des résultats différents.
docker run -it python:3.8.6 /bin/bash
pip install fbprophet
Pour moi, il s'installe parfaitement, tandis que pour lui, il produit une erreur et ne parvient pas à installer. Je pensais que le but de docker était d'éviter ce genre de problème, donc je suis vraiment perplexe.
Je donne plus de détails ci-dessous, mais ma principale question est:
- Comment est-il possible que nous obtenions des résultats différents?
Plus de détails:
Nous utilisons tous les deux Docker dans un nouveau MacBook Pro avec des spécifications similaires, sur Catalina. Son moteur Docker version 20.xx est légèrement plus récent que le mien 19.XX Aussi:
- Il a essayé toutes les commandes auxquelles il pouvait penser pour nettoyer les choses dans Docker.
- Nous avons vérifié que les hachages des ID d'image étaient les mêmes.
- Nos paramètres de ressources étaient également les mêmes.
- Il a essayé de réinstaller Docker et de passer à d'autres versions de python (3.7).
- Nous avons essayé simultanément à plusieurs reprises au cours des trois derniers jours.
Le résultat était toujours le même: il obtient l'erreur et moi pas.
L'erreur qu'il obtient est la suivante.
Error:
Installing collected packages: six, pytz, python-dateutil, pymeeus, numpy, pyparsing, pillow, pandas, korean-lunar-calendar, kiwisolver, ephem, Cython, cycler, convertdate, tqdm, setuptools-git, pystan, matplotlib, LunarCalendar, holidays, cmdstanpy, fbprophet
Running setup.py install for fbprophet ... error
ERROR: Command errored out with exit status 1:
command: /usr/local/bin/python -u -c ‘import sys, setuptools, tokenize; sys.argv[0] = ‘“’”‘/tmp/pip-install-l516b8ts/fbprophet_80d5f400081541a2bf6ee26d2785e363/setup.py’“‘”’; __file__=‘“’”‘/tmp/pip-install-l516b8ts/fbprophet_80d5f400081541a2bf6ee26d2785e363/setup.py’“‘”’;f=getattr(tokenize, ‘“’”‘open’“‘”’, open)(__file__);code=f.read().replace(‘“’”‘\r\n’“‘”’, ‘“’”‘\n’“‘”’);f.close();exec(compile(code, __file__, ‘“’”‘exec’“‘”’))' install --record /tmp/pip-record-7n8tvfkb/install-record.txt --single-version-externally-managed --compile --install-headers /usr/local/include/python3.8/fbprophet
cwd: /tmp/pip-install-l516b8ts/fbprophet_80d5f400081541a2bf6ee26d2785e363/
Complete output (10 lines):
running install
running build
running build_py
creating build
creating build/lib
creating build/lib/fbprophet
creating build/lib/fbprophet/stan_model
Importing plotly failed. Interactive plots will not work.
INFO:pystan:COMPILING THE C++ CODE FOR MODEL anon_model_dfdaf2b8ece8a02eb11f050ec701c0ec NOW.
error: command ‘gcc’ failed with exit status 1
----------------------------------------
ERROR: Command errored out with exit status 1: /usr/local/bin/python -u -c ‘import sys, setuptools, tokenize; sys.argv[0] = ‘“’”‘/tmp/pip-install-l516b8ts/fbprophet_80d5f400081541a2bf6ee26d2785e363/setup.py’“‘”’; __file__=‘“’”‘/tmp/pip-install-l516b8ts/fbprophet_80d5f400081541a2bf6ee26d2785e363/setup.py’“‘”’;f=getattr(tokenize, ‘“’”‘open’“‘”’, open)(__file__);code=f.read().replace(‘“’”‘\r\n’“‘”’, ‘“’”‘\n’“‘”’);f.close();exec(compile(code, __file__, ‘“’”‘exec’“‘”’))' install --record /tmp/pip-record-7n8tvfkb/install-record.txt --single-version-externally-managed --compile --install-headers /usr/local/include/python3.8/fbprophet Check the logs for full command output.
Notez que l'exécution des deux commandes que j'ai fournies produit toujours des erreurs, mais elles ne sont pas critiques. La mise à niveau de setuptools et l'installation des dépendances avant que fbprophet ne résout ces erreurs mineures. L'erreur indiquée ci-dessus est différente, liée à gcc, et n'arrive qu'à certaines personnes.
Questions supplémentaires facultatives:
- Comment pouvons-nous résoudre ce problème?
- Comment éviter des résultats non reproductibles comme celui-ci?
- La mise à niveau de la version du moteur Docker peut-elle casser un conteneur?
Réponses
Comment pouvons-nous résoudre ce problème?
Votre erreur signale un problème de GCC / compilation.
Une recherche rapide montre principalement les problèmes liés à la version python / gcc ( un , deux , trois ).
Mais vous avez raison, cela ne ressemble pas à ce que cela pourrait se produire à l'intérieur d'un conteneur particulier.
Ce qu'il fait ressembler à une sorte de problème de OOM .
Est-ce également une VM? Stan nécessite une quantité importante de mémoire pour compiler les modèles, et cette erreur peut se produire si vous manquez de RAM pendant la compilation.
J'ai fait un peu de test.
Sur ma machine, le processus de compilation a consommé jusqu'à 2,4 Go de RAM.
cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
uname -r
3.10.0-1160.6.1.el7.x86_64
docker --version
Docker version 20.10.1, build 831ebea
# works fine
docker run --rm -it -m 3G python:3.8.6 /bin/bash
# fails with error: command 'gcc' failed with exit status 1
# actually it was killed by OOM killer
docker run --rm -it -m 2G python:3.8.6 /bin/bash
# yes, here he is
tail -f /var/log/messages | grep -i 'killed process'
Dec 22 08:34:09 cent7-1 kernel: Killed process 5631 (cc1plus), UID 0, total-vm:2073600kB, anon-rss:1962404kB, file-rss:15332kB, shmem-rss:0kB
Dec 22 08:35:56 cent7-1 kernel: Killed process 5640 (cc1plus), UID 0, total-vm:2056816kB, anon-rss:1947392kB, file-rss:15308kB, shmem-rss:0kB
Vérifiez le journal du tueur OOM sur la machine problématique.
Y a-t-il suffisamment de RAM disponible pour Docker?
La mise à niveau de la version du moteur Docker peut-elle casser un conteneur?
En général, cela ne devrait pas être le cas.
Mais pour v20.10.0
Docker a introduit un très grand ensemble de changements liés à la mémoire et aux groupes de contrôle.
Après avoir exclu toutes les raisons évidentes (comme la machine de votre ami n'ayant tout simplement pas assez de RAM), vous devrez peut-être creuser dans les paramètres de votre démon docker liés à la mémoire / cgroups / etc.
Comment un même conteneur peut-il produire des résultats différents sur deux ordinateurs?
Eh bien, techniquement, c'est tout à fait possible.
Les programmes conteneurisés utilisent toujours le noyau du système d'exploitation hôte .
Tous les paramètres du noyau ne sont pas "namespaced", c'est-à-dire qu'ils peuvent être définis exclusivement pour un conteneur particulier.
Beaucoup d'entre eux (en fait, la plupart) sont encore globaux et peuvent affecter le comportement de votre programme.
Bien que je ne pense pas que cela soit lié à votre problème.
Mais pour les programmes compliqués reposant sur des paramètres spécifiques du noyau qui doivent être pris en compte.
C'est la solution . Ce problème n'est pas seulement une question sur docker, mais fbprophet lui-même en cause. Éviter:
docker run -it python:3.8.6 /bin/bash
pip install numpy pandas blahblah...
pip install fbprophet