Diskrepanz zwischen zwei Hosts, auf denen dieselben Docker-Befehle ausgeführt werden

Dec 19 2020

Ein Kollege und ich haben ein großes Docker-Puzzle.

Wenn wir die folgenden Befehle ausführen, erhalten wir unterschiedliche Ergebnisse.

docker run -it python:3.8.6 /bin/bash
pip install fbprophet

Für mich wird es perfekt installiert, während es für ihn einen Fehler erzeugt und nicht installiert werden kann. Ich dachte, der springende Punkt bei Docker ist, diese Art von Problem zu verhindern, also bin ich wirklich verwirrt.

Ich gebe unten weitere Details, aber meine Hauptfrage ist:

  • Wie ist es möglich, dass wir unterschiedliche Ergebnisse erzielen?

Mehr Details:

Wir beide führen Docker in einem neuen MacBook Pro mit ähnlichen Spezifikationen auf Catalina aus. Seine Docker Engine Version 20.xx ist etwas neuer als meine 19.XX. Außerdem:

  • Er versuchte alle Befehle, die ihm einfielen, um die Dinge in Docker aufzuräumen.
  • Wir haben überprüft, dass die Hashes der Bild-IDs identisch sind.
  • Unsere Ressourceneinstellungen waren ebenfalls dieselben.
  • Er versuchte, Docker neu zu installieren und zu anderen Versionen von Python (3.7) zu wechseln.
  • Wir haben es in den letzten drei Tagen mehrmals gleichzeitig versucht.

Das Ergebnis war immer das gleiche: Er bekommt den Fehler und ich nicht.

Der Fehler, den er erhält, ist der folgende.

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.

Beachten Sie, dass das Ausführen der beiden von mir bereitgestellten Befehle immer zu Fehlern führt, diese jedoch nicht kritisch sind. Durch das Aktualisieren von setuptools und das Installieren der Abhängigkeiten vor fbprophet werden diese geringfügigen Fehler behoben. Der oben gezeigte Fehler ist anders, hängt mit gcc zusammen und tritt nur bei einigen Personen auf.

Optionale Zusatzfragen:

  • Wie beheben wir das?
  • Wie verhindern wir nicht reproduzierbare Ergebnisse wie dieses?
  • Kann ein Upgrade der Docker-Engine-Version einen Container beschädigen?

Antworten

12 OlesyaBolobova Dec 22 2020 at 21:56

Wie beheben wir das?

Ihr Fehler meldet ein GCC / Kompilierungsproblem.
Eine schnelle Suche zeigt hauptsächlich Probleme im Zusammenhang mit der Python / GCC-Version ( eins , zwei , drei ).
Aber Sie haben Recht, das sieht nicht so aus, wie es in einem bestimmten Container passieren könnte.

Was es tut aussehen , ist eine Art von OOM Problem .

Ist das auch eine VM? Stan benötigt eine erhebliche Menge an Speicher, um die Modelle zu kompilieren. Dieser Fehler kann auftreten, wenn Ihnen beim Kompilieren der Arbeitsspeicher ausgeht.

Ich habe ein bisschen getestet.
Auf meinem Computer verbrauchte der Kompilierungsprozess bis zu 2,4 GB 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

Überprüfen Sie das OOM-Killer-Log auf einem problematischen Computer.
Ist genügend RAM für Docker verfügbar?


Kann ein Upgrade der Docker-Engine-Version einen Container beschädigen?

Im Allgemeinen sollte dies nicht der Fall sein.
Aber für v20.10.0Docker wurden sehr viele Änderungen in Bezug auf Speicher und Gruppen eingeführt.

Nachdem Sie alle offensichtlichen Gründe ausgeschlossen haben (z. B. wenn der Computer Ihres Freundes nicht über genügend RAM verfügt), müssen Sie möglicherweise die Einstellungen Ihres Docker-Daemons in Bezug auf Speicher / Gruppen / usw. überprüfen.


Wie kann derselbe Container auf zwei Computern unterschiedliche Ergebnisse erzielen?

Technisch ist das durchaus möglich.
Containerisierte Programme verwenden weiterhin den Kernel des Host-Betriebssystems .
Nicht alle Kerneleinstellungen sind "Namespaced", dh sie können ausschließlich für einen bestimmten Container festgelegt werden.
Viele von ihnen (eigentlich die meisten) sind immer noch global und können das Verhalten Ihres Programms beeinflussen.

Obwohl ich nicht denke, dass es mit Ihrem Problem zusammenhängt.
Aber für komplizierte Programme, die auf bestimmten Kernel-Einstellungen basieren, die berücksichtigt werden müssen.

1 AkihitoKIRISAKI Dec 19 2020 at 13:15

Das ist Lösung . Dieses Problem betrifft nicht nur Docker, sondern fbprophet selbst. Vermeiden:

docker run -it python:3.8.6 /bin/bash
pip install numpy pandas blahblah...
pip install fbprophet