Discrepância entre dois hosts executando os mesmos comandos docker

Dec 19 2020

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

12 OlesyaBolobova Dec 22 2020 at 21:56

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

1 AkihitoKIRISAKI Dec 19 2020 at 13:15

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