Rozbieżność między dwoma hostami korzystającymi z tych samych poleceń dockera

Dec 19 2020

Razem z kolegą mamy dużą łamigłówkę Dockera.

Kiedy uruchamiamy następujące polecenia, otrzymujemy różne wyniki.

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

U mnie instaluje się idealnie, podczas gdy u niego generuje błąd i nie instaluje się. Myślałem, że celem dockera jest zapobieganie tego rodzaju problemom, więc jestem naprawdę zdziwiony.

Poniżej podaję więcej szczegółów, ale moje główne pytanie brzmi:

  • Jak to możliwe, że otrzymujemy różne wyniki?

Więcej szczegółów:

Obaj używamy Dockera na nowym MacBooku Pro z podobnymi specyfikacjami, na Catalinie. Jego silnik Docker w wersji 20.xx jest nieco nowszy niż mój 19.XX Ponadto:

  • Wypróbował wszystkie polecenia, jakie przyszło mu do głowy, aby uporządkować rzeczy w Dockerze.
  • Sprawdziliśmy, że skróty identyfikatorów obrazów są takie same.
  • Nasze ustawienia zasobów były również takie same.
  • Próbował przeinstalować Dockera i przejść na inne wersje Pythona (3.7).
  • Próbowaliśmy jednocześnie wielokrotnie w ciągu ostatnich trzech dni.

Wynik był zawsze taki sam: on dostaje błąd, a ja nie.

Otrzymuje następujący błąd.

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.

Zauważ, że uruchomienie dwóch podanych przeze mnie poleceń zawsze powoduje błędy, ale nie są one krytyczne. Aktualizacja setuptools i zainstalowanie zależności przed fbprophet rozwiązuje te drobne błędy. Pokazany powyżej błąd jest inny, związany z gcc i zdarza się tylko niektórym osobom.

Opcjonalne dodatkowe pytania:

  • Jak to naprawimy?
  • Jak możemy zapobiec niemożliwym do odtworzenia wynikom, takim jak ten?
  • Czy uaktualnienie wersji silnika platformy Docker może uszkodzić kontener?

Odpowiedzi

12 OlesyaBolobova Dec 22 2020 at 21:56

Jak to naprawimy?

Twój błąd zgłasza problem z GCC / kompilacją.
Szybkie wyszukiwanie pokazuje głównie problemy związane z wersją Python / gcc ( jeden , dwa , trzy ).
Ale masz rację, to nie wygląda tak, jak mogłoby się to zdarzyć w jednym konkretnym pojemniku.

Co to ma wyglądać to jakiś błąd OOM .

Czy to jest maszyna wirtualna? Stan wymaga znacznej ilości pamięci do kompilowania modeli, a ten błąd może wystąpić, jeśli podczas kompilacji zabraknie pamięci RAM.

Trochę testowałem.
Na moim komputerze proces kompilacji zużywał do 2,4 GB pamięci 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

Sprawdź logowanie OOM Killer na problematycznej maszynie.
Czy dostępna jest wystarczająca ilość pamięci RAM dla platformy Docker?


Czy uaktualnienie wersji silnika platformy Docker może uszkodzić kontener?

Generalnie nie powinno tak być.
Jednak dla v20.10.0Dockera wprowadzono bardzo duży zestaw zmian związanych z pamięcią i cgroups.

Po wykluczeniu wszystkich oczywistych powodów (takich jak komputer twojego przyjaciela po prostu nie ma wystarczającej ilości pamięci RAM), być może będziesz musiał zagłębić się w ustawienia demona Dockera związane z pamięcią / cgroups / itp.


W jaki sposób ten sam kontener może dawać różne wyniki na dwóch komputerach?

Cóż, technicznie jest to całkiem możliwe.
Programy kontenerowe nadal używają jądra systemu operacyjnego hosta .
Nie wszystkie ustawienia jądra są „przestrzenią nazw”, tj. Można je ustawić wyłącznie dla jednego konkretnego kontenera.
Wiele z nich (właściwie większość) jest nadal globalnych i może wpływać na zachowanie programu.

Chociaż nie sądzę, że jest to związane z twoim problemem.
Ale w przypadku skomplikowanych programów opierających się na określonych ustawieniach jądra, należy to wziąć pod uwagę.

1 AkihitoKIRISAKI Dec 19 2020 at 13:15

To jest rozwiązanie . Ten problem dotyczy nie tylko dockera, ale samego fbprophet. Unikać:

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