Rozbieżność między dwoma hostami korzystającymi z tych samych poleceń dockera
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
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.0
Dockera 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ę.
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