Perbedaan antara dua host yang menjalankan perintah buruh pelabuhan yang sama

Dec 19 2020

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

12 OlesyaBolobova Dec 22 2020 at 21:56

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.0Docker 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.

1 AkihitoKIRISAKI Dec 19 2020 at 13:15

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