Écart entre deux hôtes exécutant les mêmes commandes docker

Dec 19 2020

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

12 OlesyaBolobova Dec 22 2020 at 21:56

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.0Docker 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.

1 AkihitoKIRISAKI Dec 19 2020 at 13:15

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