Perbedaan antara dua host yang menjalankan perintah buruh pelabuhan yang sama
Seorang rekan kerja dan saya memiliki teka-teki Docker yang besar.
Ketika kami menjalankan perintah berikut, kami mendapatkan hasil yang berbeda.
docker run -it python:3.8.6 /bin/bash
pip install fbprophet
Bagi saya, itu menginstal dengan sempurna, sedangkan baginya itu menghasilkan kesalahan dan gagal untuk menginstal. Saya pikir inti dari buruh pelabuhan adalah untuk mencegah masalah seperti ini, jadi saya sangat bingung.
Saya memberikan detail lebih lanjut di bawah ini, tetapi pertanyaan utama saya adalah:
- Bagaimana mungkin kami mendapatkan hasil yang berbeda?
Keterangan lebih lanjut:
Kami berdua menjalankan Docker di MacBook Pro baru dengan spesifikasi serupa, di Catalina. Mesin Docker-nya versi 20.xx sedikit lebih baru dari milik saya 19.XX Juga:
- Dia mencoba semua perintah yang terpikir olehnya untuk membersihkan berbagai hal di Docker.
- Kami memverifikasi bahwa hash ID gambar itu sama.
- Pengaturan sumber daya kami juga sama.
- Dia mencoba menginstal ulang Docker dan mengubah ke versi lain dari python (3.7).
- Kami mencoba secara bersamaan dalam beberapa kesempatan selama tiga hari terakhir.
Hasilnya selalu sama: Dia mendapat kesalahan dan saya tidak.
Kesalahan yang dia dapatkan adalah sebagai berikut.
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.
Perhatikan bahwa menjalankan dua perintah yang saya berikan selalu menghasilkan kesalahan, tetapi tidak kritis. Mengupgrade alat pengaturan dan menginstal dependensi sebelum fbprophet menyelesaikan kesalahan kecil tersebut. Kesalahan yang ditunjukkan di atas berbeda, terkait dengan gcc, dan hanya terjadi pada beberapa orang.
Pertanyaan tambahan opsional:
- Bagaimana cara kami memperbaikinya?
- Bagaimana kami mencegah hasil yang tidak dapat direproduksi seperti ini?
- Bisakah mengupgrade versi mesin buruh pelabuhan merusak sebuah kontainer?
Jawaban
Bagaimana cara kami memperbaikinya?
Kesalahan Anda melaporkan masalah GCC / kompilasi.
Pencarian cepat menunjukkan sebagian besar masalah yang terkait dengan versi python / gcc ( satu , dua , tiga ).
Tapi Anda benar, ini tidak terlihat seperti yang bisa terjadi di dalam satu wadah tertentu.
Apa yang dilakukannya terlihat seperti beberapa jenis masalah OOM .
Juga, apakah ini VM? Stan memerlukan sejumlah besar memori untuk mengkompilasi model, dan kesalahan ini dapat terjadi jika Anda kehabisan RAM saat sedang mengkompilasi.
Saya melakukan sedikit pengujian.
Di komputer saya, proses kompilasi memakan RAM hingga 2,4 Gb.
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
Periksa log pembunuh OOM pada mesin bermasalah.
Apakah ada cukup RAM yang tersedia untuk Docker?
Bisakah mengupgrade versi mesin buruh pelabuhan merusak sebuah kontainer?
Secara umum, seharusnya tidak demikian.
Tetapi untuk v20.10.0
Docker memperkenalkan satu set perubahan yang sangat besar terkait dengan memori dan cgroups.
Setelah Anda mengesampingkan semua alasan yang jelas (seperti mesin teman Anda tidak memiliki cukup RAM), Anda mungkin perlu menggali pengaturan daemon buruh pelabuhan Anda yang terkait dengan memori / cgroups / dll.
Bagaimana wadah yang sama menghasilkan hasil yang berbeda pada dua komputer?
Nah, secara teknis itu sangat mungkin.
Program dalam container masih menggunakan kernel OS host .
Tidak semua pengaturan kernel memiliki "ruang nama", yaitu dapat diatur secara eksklusif untuk satu wadah tertentu.
Banyak di antaranya (sebenarnya sebagian besar) masih bersifat global dan dapat memengaruhi perilaku program Anda.
Meskipun saya tidak berpikir itu terkait dengan masalah Anda.
Tetapi untuk program yang rumit mengandalkan pengaturan kernel tertentu yang harus diperhitungkan.
Inilah solusinya . Masalah ini bukan hanya menjadi masalah pada buruh pelabuhan, tapi penyebab fbprophet sendiri. Menghindari:
docker run -it python:3.8.6 /bin/bash
pip install numpy pandas blahblah...
pip install fbprophet