Несоответствие между двумя хостами, выполняющими одни и те же команды Docker

У нас с коллегой есть большая головоломка Docker.

Когда мы запускаем следующие команды, мы получаем разные результаты.

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

У меня он устанавливается отлично, а у него выдает ошибку и не устанавливается. Я думал, что весь смысл докера в том, чтобы предотвратить подобные проблемы, поэтому я действительно озадачен.

Я даю более подробную информацию ниже, но мой главный вопрос:

  • Как это возможно, что мы получаем разные результаты?

Подробнее:

Мы оба используем Docker на новом MacBook Pro с аналогичными характеристиками на Catalina. Его движок Docker версии 20.x.x немного новее моего 19.X.X. Также:

  • Он перепробовал все команды, которые только мог придумать, чтобы навести порядок в Docker.
  • Мы проверили, что хэши идентификаторов изображений совпадают.
  • Наши настройки ресурсов также были одинаковыми.
  • Он попытался переустановить Docker и перейти на другие версии Python (3.7).
  • Мы пытались одновременно несколько раз в течение последних трех дней.

Результат всегда был один и тот же: он получает ошибку, а я нет.

Ошибка, которую он получает, заключается в следующем.

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.

Обратите внимание, что выполнение двух приведенных мной команд всегда приводит к ошибкам, но они не являются критическими. Обновление setuptools и установка зависимостей до того, как fbprophet решит эти незначительные ошибки. Показанная выше ошибка связана с gcc и возникает только у некоторых людей.

Необязательные дополнительные вопросы:

  • Как это исправить?
  • Как предотвратить невоспроизводимые результаты, подобные этому?
  • Может ли обновление версии движка докеров сломать контейнер?

Разница в версии докера может не повлиять на эту проблему. Поскольку моя среда выглядит так, версия докера 19.03.13, Ubuntu 20.04.

Akihito KIRISAKI 19.12.2020 06:57

Если у кого-то есть лучшее описание названия вопроса, пожалуйста, дайте мне знать. Я думаю, что это нуждается в улучшении.

German Capuano 21.12.2020 18:47

Если у вас нет ничего интересного в докере, попробуйте docker rm -f $(docker ps -aq) && docker system prune --all --volumes. Затем повторите попытку на своем Mac. Я вижу то же поведение, что и ваш коллега на моей стороне (Big Sur с последним демоном докера)

β.εηοιτ.βε 22.12.2020 00:36

Вот журнал запуска данной команды на новом докере, если кто-то хочет быстро взглянуть на него. dpaste.com//C5V8QKQLA

BcK 22.12.2020 01:05

Возможно, изображение для этого тега изменилось. Можете ли вы сравнить ваши два docker images результата?

Danny Varod 22.12.2020 01:24

@β.εηοιτ.βε спасибо. Он пробовал их, но это не сработало :(

German Capuano 22.12.2020 15:41

@DannyVarod, это отличается от проверки идентификаторов образов докеров? Извините, я не уверен, что понимаю.

German Capuano 22.12.2020 15:41

@GermanCapuano то же самое, что и проверка идентификаторов, в отличие от проверки тегов, поскольку тег может быть обновлен до нового идентификатора.

Danny Varod 22.12.2020 15:56

@GermanCapuano Ваш коллега ничего не должен делать, у него правильное поведение. Вы должны запустить эти команды

β.εηοιτ.βε 22.12.2020 15:58

@GermanCapuano, не могли бы вы принять ответ, если он помог :)

Olesya Bolobova 24.12.2020 22:59

@OlesyaBolobova, да, я просто ждал несколько дней, чтобы увидеть, не хочет ли кто-нибудь прокомментировать это или не согласиться с чем-то. Никто этого не сделал, поэтому я принял это и дал тебе награду. Спасибо :)

German Capuano 25.12.2020 23:05
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
7
11
520
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это решение. Эта проблема связана не только с докером, но и с самим fbprophet. Избегать:

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

Мы попробовали это. Это не решило. Спасибо за предложение.

German Capuano 19.12.2020 16:44
Ответ принят как подходящий

Как это исправить?

Ваша ошибка сообщает о проблеме GCC/компиляции.
Быстрый поиск показывает в основном проблемы, связанные с версией python/gcc (одна , две , три).
Но вы правы, это не похоже на то, что это могло произойти внутри одного конкретного контейнера.

На самом деле это похоже на какую-то OOM-проблему.

Кроме того, это виртуальная машина? Стэну требуется значительный объем памяти для скомпилируйте модели, и эта ошибка может возникнуть, если у вас закончилась оперативная память пока он компилируется.

Я провел небольшое тестирование.
На моей машине процесс компиляции потреблял до 2,4 Гб оперативной памяти.

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 killer на проблемной машине.
Достаточно ли оперативной памяти для Docker?


Может ли обновление версии движка докеров сломать контейнер?

В общем, так быть не должно.
Но для v20.10.0 Docker ввел очень большой набор изменений, связанных с памятью и контрольными группами.

После того, как вы исключите все очевидные причины (например, на машине вашего друга просто не хватает оперативной памяти), вам может понадобиться покопаться в настройках вашего демона докера, связанных с памятью / cgroups / и т. д.


Как один и тот же контейнер может давать разные результаты на двух компьютерах?

Ну, технически это вполне возможно.
Контейнерные программы по-прежнему используют ядро ​​ОС хоста.
Не все настройки ядра имеют "пространство имен", т.е. е. можно установить исключительно для одного конкретного контейнера.
Многие из них (на самом деле, большинство) по-прежнему глобальны и могут влиять на поведение вашей программы.

Хотя я не думаю, что это связано с вашей проблемой. Но для сложных программ, зависящих от конкретных настроек ядра, это необходимо учитывать.

Ух ты!! Это была память. Он увеличил память и все заработало!!!! Похоже, мы случайно уложились в лимит оперативной памяти, и различий в докере хватило, чтобы один вышел из строя, а другой — нет.

German Capuano 22.12.2020 16:13

Другие вопросы по теме