Discrepância entre dois hosts executando os mesmos comandos docker
Um colega e eu temos um grande quebra-cabeça do Docker.
Quando executamos os seguintes comandos, obtemos resultados diferentes.
docker run -it python:3.8.6 /bin/bash
pip install fbprophet
Para mim, ele instala perfeitamente, enquanto para ele produz um erro e falha na instalação. Achei que o objetivo do docker era evitar esse tipo de problema, então estou muito confuso.
Estou dando mais detalhes abaixo, mas minha principal dúvida é:
- Como é possível obtermos resultados diferentes?
Mais detalhes:
Ambos estamos executando o Docker em um novo MacBook Pro com especificações semelhantes, no Catalina. Sua versão do motor Docker 20.xx é ligeiramente mais recente que a minha 19.XX Além disso:
- Ele tentou todos os comandos que conseguiu pensar para limpar as coisas no Docker.
- Verificamos que os hashes dos IDs das imagens eram os mesmos.
- Nossas configurações de recursos também eram as mesmas.
- Ele tentou reinstalar o Docker e mudar para outras versões do python (3.7).
- Tentamos simultaneamente em várias ocasiões durante os últimos três dias.
O resultado era sempre o mesmo: ele entendeu o erro e eu, não.
O erro que ele recebe é o seguinte.
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.
Observe que a execução dos dois comandos que forneci sempre produz erros, mas eles não são críticos. Atualizar ferramentas de configuração e instalar as dependências antes de fbprophet resolver esses pequenos erros. O erro mostrado acima é diferente, relacionado ao gcc, e só acontece com algumas pessoas.
Perguntas adicionais opcionais:
- Como podemos consertar isso?
- Como evitamos resultados não reproduzíveis como este?
- Atualizar a versão do docker engine pode quebrar um contêiner?
Respostas
Como podemos consertar isso?
Seu erro relata um problema de GCC / compilação.
Uma pesquisa rápida mostra principalmente problemas relacionados à versão python / gcc ( um , dois , três ).
Mas você está certo, isso não parece que poderia acontecer dentro de um determinado contêiner.
O que faz parecer com algum tipo de problema OOM .
Além disso, isso é uma VM? Stan requer uma quantidade significativa de memória para compilar os modelos, e este erro pode ocorrer se você ficar sem RAM durante a compilação.
Eu fiz alguns testes.
Na minha máquina, o processo de compilação consumiu até 2,4 Gb de 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
Verifique o log do assassino OOM na máquina problemática.
Há RAM suficiente disponível para o Docker?
Atualizar a versão do docker engine pode quebrar um contêiner?
Geralmente, não deveria ser o caso.
Mas para v20.10.0
Docker introduziu um grande conjunto de mudanças relacionadas à memória e cgroups.
Depois de descartar todas as razões óbvias (como a máquina do seu amigo simplesmente não ter RAM suficiente), pode ser necessário examinar as configurações do docker daemon relacionadas a memória / cgroups / etc.
Como o mesmo contêiner pode produzir resultados diferentes em dois computadores?
Bem, tecnicamente é bem possível.
Os programas em contêiner ainda usam o kernel do sistema operacional host .
Nem todas as configurações do kernel têm "namespaces", ou seja, podem ser definidas exclusivamente para um contêiner específico.
Muitos deles (na verdade, a maioria) ainda são globais e podem afetar o comportamento do seu programa.
Embora eu não ache que esteja relacionado ao seu problema.
Porém, para programas complicados que dependem de configurações específicas do kernel, isso deve ser levado em consideração.
Esta é a solução . Esse problema não é apenas uma questão do docker, mas o próprio fbprophet causa. Evitar:
docker run -it python:3.8.6 /bin/bash
pip install numpy pandas blahblah...
pip install fbprophet