同じdockerコマンドを実行している2つのホスト間の不一致
同僚と私は大きなDockerパズルを持っています。
次のコマンドを実行すると、異なる結果が得られます。
docker run -it python:3.8.6 /bin/bash
pip install fbprophet
私にとっては完全にインストールされますが、彼にとってはエラーが発生してインストールに失敗します。dockerの目的はこのような問題を防ぐことだと思っていたので、本当に戸惑いました。
以下に詳細を示しますが、私の主な質問は次のとおりです。
- どうして違う結果が得られるのでしょうか?
詳細:
私たちは両方とも、カタリナで、同様の仕様の新しいMacBookProでDockerを実行しています。彼のDockerエンジンバージョン20.xxは、私の19.XXよりも少し新しいです。
- 彼は、Dockerで物事をクリーンアップするために考えられるすべてのコマンドを試しました。
- 画像IDのハッシュが同じであることを確認しました。
- リソース設定も同じでした。
- 彼はDockerを再インストールし、他のバージョンのpython(3.7)に変更しようとしました。
- 過去3日間に複数回同時に試してみました。
結果は常に同じでした。彼はエラーを受け取りますが、私はエラーを受け取りません。
彼が得るエラーは次のとおりです。
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.
私が提供した2つのコマンドを実行すると、常にエラーが発生しますが、重要ではないことに注意してください。fbprophetがこれらのマイナーエラーを解決する前に、setuptoolsをアップグレードし、依存関係をインストールします。上記のエラーは異なり、gccに関連しており、一部の人にのみ発生します。
オプションの追加の質問:
- どうすれば修正できますか?
- このような再現不可能な結果を防ぐにはどうすればよいですか?
- Dockerエンジンのバージョンをアップグレードすると、コンテナーが破損する可能性がありますか?
回答
どうすれば修正できますか?
エラーはGCC /コンパイルの問題を報告します。
クイック検索ショーほとんどの問題のpython / gccのバージョン(に関連する1、2、3)。
しかし、あなたは正しいです、これは特定のコンテナ内で発生する可能性があるため、そうではありません。
それがどのように見えるかは、ある種のOOM問題です。
また、これはVMですか?Stanは、モデルをコンパイルするために大量のメモリを必要とします。このエラーは、コンパイル中にRAMが不足した場合に発生する可能性があります。
少しテストをしました。
私のマシンでは、コンパイルプロセスで最大2.4Gbの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
問題のあるマシンのOOMキラーログを確認してください。
Dockerに使用できる十分なRAMはありますか?
Dockerエンジンのバージョンをアップグレードすると、コンテナーが破損する可能性がありますか?
一般的に、そうではないはずです。
しかし、v20.10.0
Dockerの場合、メモリとcgroupに関連する非常に大きな一連の変更が導入されました。
明らかな理由(友人のマシンに十分なRAMがないなど)をすべて除外した後、メモリ/ cgroupsなどに関連するDockerデーモン設定を掘り下げる必要がある場合があります。
同じコンテナが2台のコンピュータで異なる結果を生成するにはどうすればよいですか?
まあ、技術的にはそれはかなり可能です。
コンテナ化されたプログラムは、引き続きホストOSカーネルを使用します。
すべてのカーネル設定が「名前空間」になっているわけではありません。つまり、特定の1つのコンテナ専用に設定できます。
それらの多く(実際にはほとんど)はまだグローバルであり、プログラムの動作に影響を与える可能性があります。
私はそれがあなたの問題に関係しているとは思わないが。
ただし、考慮しなければならない特定のカーネル設定に依存する複雑なプログラムの場合。
これが解決策です。この問題はdockerの問題だけでなく、fbprophet自体が原因です。避けるために:
docker run -it python:3.8.6 /bin/bash
pip install numpy pandas blahblah...
pip install fbprophet