Aynı docker komutlarını çalıştıran iki ana bilgisayar arasındaki tutarsızlık
Bir meslektaşım ve benim büyük bir Docker bulmacamız var.
Aşağıdaki komutları çalıştırdığımızda farklı sonuçlar alıyoruz.
docker run -it python:3.8.6 /bin/bash
pip install fbprophet
Benim için mükemmel bir şekilde kuruluyor, onun için bir hata oluşturuyor ve yüklenemiyor. Docker'ın tüm amacının bu tür sorunları önlemek olduğunu düşündüm, bu yüzden gerçekten kafam karıştı.
Aşağıda daha fazla ayrıntı veriyorum, ancak asıl sorum şu:
- Nasıl farklı sonuçlar almamız mümkün?
Daha fazla detay:
İkimiz de Docker'ı Catalina'da benzer özelliklere sahip yeni bir MacBook Pro'da çalıştırıyoruz. Docker motoru sürüm 20.xx benim 19.XX sürümünden biraz daha yeni. Ayrıca:
- Docker'daki şeyleri temizlemek için aklına gelen tüm komutları denedi.
- Görüntü kimliklerinin karmalarının aynı olduğunu doğruladık.
- Kaynak ayarlarımız da aynıydı.
- Docker'ı yeniden yüklemeyi ve diğer python (3.7) sürümlerine geçmeyi denedi.
- Son üç gün içinde birden çok kez aynı anda denedik.
Sonuç hep aynıydı: O hatayı alıyor ve ben almıyorum.
Aldığı hata şudur.
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.
Sağladığım iki komutu çalıştırmanın her zaman hata ürettiğini, ancak kritik olmadıklarını unutmayın. Kurulum araçlarını yükseltmek ve fbprophet bu küçük hataları çözmeden önce bağımlılıkları yüklemek. Yukarıda gösterilen hata farklıdır, gcc ile ilgilidir ve yalnızca bazı kişilerin başına gelir.
İsteğe bağlı ek sorular:
- Bunu nasıl düzeltiriz?
- Bunun gibi tekrarlanamayan sonuçları nasıl engelleriz?
- Docker motoru sürümünü yükseltmek bir kapsayıcıyı bozabilir mi?
Yanıtlar
Bunu nasıl düzeltiriz?
Hatanız bir GCC / derleme sorunu bildiriyor.
Hızlı bir arama, çoğunlukla python / gcc sürümüyle ( bir , iki , üç ) ilgili sorunları gösterir .
Ama haklısın, bu belirli bir konteynerin içinde olabileceği gibi görünmüyor.
Ne yapar bakmak gibi bir çeşit OOM sorun .
Ayrıca, bu bir VM mi? Stan, modelleri derlemek için önemli miktarda belleğe ihtiyaç duyar ve bu hata, derleme sırasında RAM'iniz biterse ortaya çıkabilir.
Biraz test yaptım.
Makinemde derleme işlemi 2,4 Gb RAM tüketti.
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
Sorunlu makinede OOM katil günlüğünü kontrol edin.
Docker için yeterli RAM var mı?
Docker motoru sürümünü yükseltmek bir kapsayıcıyı bozabilir mi?
Genel olarak, durum böyle olmamalıdır.
Ancak v20.10.0
Docker için bellek ve cgruplar ile ilgili çok büyük bir değişiklik seti getirdi.
Tüm bariz nedenleri ortadan kaldırdıktan sonra (arkadaşınızın makinesinin yeterli RAM'e sahip olmaması gibi), bellek / cgroups / vb. İle ilgili docker daemon ayarlarınıza girmeniz gerekebilir.
Aynı kap iki bilgisayarda nasıl farklı sonuçlar üretebilir?
Teknik olarak oldukça mümkün.
Kapsayıcıya alınmış programlar, ana işletim sistemi çekirdeğini kullanmaya devam eder .
Tüm çekirdek ayarları "isim alanlı" değildir, yani yalnızca belirli bir kap için ayarlanabilir.
Bunların çoğu (aslında çoğu) hala küreseldir ve programınızın davranışını etkileyebilir.
Senin sorununla ilgili olduğunu sanmıyorum.
Ancak, dikkate alınması gereken belirli çekirdek ayarına dayanan karmaşık programlar için.
Çözüm budur . Bu sorun sadece liman işçisiyle ilgili bir sorun değil, fbprophet'in kendisinin neden olduğu bir sorundur. Kaçınmak:
docker run -it python:3.8.6 /bin/bash
pip install numpy pandas blahblah...
pip install fbprophet