Discrepancia entre dos hosts que ejecutan los mismos comandos de la ventana acoplable
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
¿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 sí 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.0
Docker 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.
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