동일한 도커 명령을 실행하는 두 호스트 간의 불일치
동료와 저는 큰 Docker 퍼즐을 가지고 있습니다.
다음 명령을 실행하면 다른 결과가 나타납니다.
docker run -it python:3.8.6 /bin/bash
pip install fbprophet
나에게는 완벽하게 설치되지만 그에게는 오류가 발생하고 설치에 실패합니다. 도커의 요점은 이런 종류의 문제를 방지하는 것이라고 생각했기 때문에 정말 당황합니다.
아래에 더 자세한 정보를 제공하지만 주요 질문은 다음과 같습니다.
- 어떻게 다른 결과를 얻을 수 있습니까?
자세한 내용은:
우리 둘 다 Catalina에서 비슷한 사양의 새로운 MacBook Pro에서 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.
내가 제공 한 두 명령을 실행하면 항상 오류가 발생하지만 중요하지는 않습니다. fbprophet 전에 setuptools를 업그레이드하고 종속성을 설치하면 이러한 사소한 오류가 해결됩니다. 위에 표시된 오류는 gcc와 관련되어 다르며 일부 사용자에게만 발생합니다.
선택적 추가 질문 :
- 어떻게 고칠까요?
- 이와 같이 재현 불가능한 결과를 어떻게 방지합니까?
- Docker 엔진 버전을 업그레이드하면 컨테이너가 손상 될 수 있습니까?
답변
어떻게 고칠까요?
오류가 GCC / 컴파일 문제를보고합니다.
빠른 검색은 대부분 python / gcc 버전 ( one , two , three ) 과 관련된 문제를 보여줍니다 .
그러나 당신이 옳습니다. 이것은 하나의 특정 컨테이너 내부에서 발생할 수있는 것처럼 보이지 않습니다.
그것은 무엇 않는 모습 같은 것은 어떤 종류의 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 등과 관련된 도커 데몬 설정을 조사해야 할 수 있습니다.
동일한 컨테이너가 두 컴퓨터에서 어떻게 다른 결과를 생성 할 수 있습니까?
글쎄요, 기술적으로는 가능합니다.
컨테이너화 된 프로그램은 여전히 호스트 OS 커널을 사용합니다 .
모든 커널 설정이 "네임 스페이스"인 것은 아닙니다. 즉, 하나의 특정 컨테이너에 대해 독점적으로 설정할 수 있습니다.
대부분 (실제로는 대부분)은 여전히 전역 적이며 프로그램의 동작에 영향을 미칠 수 있습니다.
나는 그것이 당신의 문제와 관련이 있다고 생각하지 않지만.
그러나 고려해야 할 특정 커널 설정에 의존하는 복잡한 프로그램의 경우.
이것이 해결책 입니다. 이 문제는 docker의 문제가 아니라 fbprophet 자체가 원인입니다. 피하려면 :
docker run -it python:3.8.6 /bin/bash
pip install numpy pandas blahblah...
pip install fbprophet