Discrepancia entre dos hosts que ejecutan los mismos comandos de la ventana acoplable

Dec 19 2020

Un colega y yo tenemos un gran rompecabezas de Docker.

Cuando ejecutamos los siguientes comandos obtenemos resultados diferentes.

docker run -it python:3.8.6 /bin/bash
pip install fbprophet

Para mí se instala perfectamente, mientras que para él produce un error y no se instala. Pensé que el objetivo de la ventana acoplable es evitar este tipo de problemas, así que estoy realmente desconcertado.

A continuación, doy más detalles, pero mi pregunta principal es:

  • ¿Cómo es posible que obtengamos resultados diferentes?

Más detalles:

Ambos estamos ejecutando Docker en una nueva MacBook Pro con especificaciones similares, en Catalina. Su versión 20.xx del motor Docker es un poco más nueva que la mía 19.XX Además:

  • Probó todos los comandos que se le ocurrieron para limpiar cosas en Docker.
  • Verificamos que los valores hash de los ID de imagen fueran los mismos.
  • Nuestra configuración de recursos también era la misma.
  • Intentó reinstalar Docker y cambiar a otras versiones de python (3.7).
  • Lo intentamos simultáneamente en múltiples ocasiones durante los últimos tres días.

El resultado era siempre el mismo: él recibe el error y yo no.

El error que obtiene es el siguiente.

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.

Tenga en cuenta que ejecutar los dos comandos que proporcioné siempre produce errores, pero no son críticos. Actualizar setuptools e instalar las dependencias antes de fbprophet resuelve esos errores menores. El error que se muestra arriba es diferente, relacionado con gcc, y solo le ocurre a algunas personas.

Preguntas adicionales opcionales:

  • ¿Cómo lo arreglamos?
  • ¿Cómo evitamos resultados no reproducibles como este?
  • ¿La actualización de la versión del motor de Docker puede romper un contenedor?

Respuestas

12 OlesyaBolobova Dec 22 2020 at 21:56

¿Cómo lo arreglamos?

Su error informa un problema de compilación / GCC.
Una búsqueda rápida muestra principalmente problemas relacionados con la versión de python / gcc ( uno , dos , tres ).
Pero tiene razón, esto no parece que pueda suceder dentro de un contenedor en particular.

Lo que parece es una especie de problema OOM .

Además, ¿es esta una máquina virtual? Stan requiere una cantidad significativa de memoria para compilar los modelos, y este error puede ocurrir si se queda sin RAM mientras se compila.

Hice algunas pruebas.
En mi máquina, el proceso de compilación consumió hasta 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

Compruebe el registro asesino de OOM en la máquina problemática.
¿Hay suficiente RAM disponible para Docker?


¿La actualización de la versión del motor de Docker puede romper un contenedor?

Generalmente, no debería ser el caso.
Pero para v20.10.0Docker introdujo un gran conjunto de cambios relacionados con la memoria y los cgroups.

Después de descartar todas las razones obvias (como que la máquina de su amigo simplemente no tiene suficiente RAM), es posible que deba profundizar en la configuración del demonio de la ventana acoplable relacionada con la memoria / cgroups / etc.


¿Cómo puede el mismo contenedor producir resultados diferentes en dos computadoras?

Bueno, técnicamente es bastante posible.
Los programas en contenedores todavía usan el kernel del sistema operativo host .
No todas las configuraciones del kernel tienen "espacio de nombres", es decir, pueden configurarse exclusivamente para un contenedor en particular.
Muchos de ellos (en realidad, la mayoría) siguen siendo globales y pueden afectar el comportamiento de su programa.

Aunque no creo que esté relacionado con tu problema.
Pero para programas complicados que dependen de la configuración específica del kernel, se debe tener en cuenta.

1 AkihitoKIRISAKI Dec 19 2020 at 13:15

Esta es la solucion . Este problema no es solo un problema en la ventana acoplable, sino que también lo causa fbprophet. Para evitar:

docker run -it python:3.8.6 /bin/bash
pip install numpy pandas blahblah...
pip install fbprophet