Изображение докера не запускается на Raspberry Pi со странной ошибкой узла

#node.js #docker #raspberry-pi

Вопрос:

Я работал над проектом, который я развертываю через докер на raspberry pi в своем доме. На данный момент у меня, вероятно, ~10 обновлений в процессе, поэтому я уже успешно запустил свой проект в docker на своем RBP.

Конвейер заключается в том, что я отправляю свой код на Github, а действие/рабочий процесс github создает и отправляет изображение в Docker Hub. Затем я подключаюсь по SSH к своему Raspberry Pi вручную, извлекаю изображение из Docker Hub и запускаю его.

Все работало нормально, пока я просто не внес несколько изменений в приложение node, работающее внутри образа. Когда я вытаскиваю и запускаю изображение на Raspberry Pi, я получаю странную ошибку узла… что-то о времени в микросекундах?

Node.js[1]: ../src/util.cc:188:double node::GetCurrentTimeInMicroseconds(): Assertion `(0) == (uv_gettimeofday(amp;tv))' failed.

Обратите внимание, что я не внес никаких изменений в конвейер или процесс развертывания. И я ничего не изменил в файле настроек. «Критическое изменение», по сути, было просто переустройством некоторых экспресс-маршрутов в приложении Node, которое я разобрал и повторно развернул в Docker, но все равно получил вышеуказанную ошибку.

Что еще более странно, так это то, что изображение на моем Macbook работает совершенно нормально. Смотрите изображение двух терминалов: один ssh в RBP и один на моем Macbook. Вы можете видеть, что я извлекаю одно и то же изображение из dockerhub и запускаю его на каждой машине с очень разными результатами. Терминал Macbook даже показывает ошибку, потому что я скомпилировал изображение buildx для запуска на arm архитектуре… но он все равно запускает мой код.

Я искал ошибку узла несколькими различными способами, но ничего не нашел. Я в основном понятия не имею, что происходит, и это полностью остановило мой прогресс. Я попытался обновить сам Pi, выключить/включить его, удалить / переустановить docker, удалить все образы docker (вы можете видеть docker image ls как команду в терминале RBP) и повторно нажать мой код, чтобы запустить другую сборку образа.

Любые мысли будут высоко оценены! Даже о том, как получить более подробные журналы при загрузке образа docker. Как вы можете видеть в терминале RBP ниже, он показывает одну ошибку и завершает работу.

Два терминала пытаются вытащить и запустить один и тот же образ докера

Комментарии:

1. Я знаю, что это не тот ответ, которого вы ожидали бы, но попробуйте запустить свой контейнер в новой установке microsd. Я не знаю почему, но иногда подобные проблемы случаются со мной, и после новой установки raspibian все работает нормально.

2. Похоже, что узел не может получить действительное время. Что вы используете в качестве базового образа для своего образа Docker? Установлен ли в образе libuv? Вы также можете попробовать использовать strace , чтобы проверить, какие системные вызовы происходят под капотом.

3. Я постараюсь получить новую установку raspbian, спасибо за предложение @guilfer! И я просто использую узел в качестве базового изображения ( FROM node ), и я не знаю о libuv. Я не использовал strace (очень новичок в докере), но я проведу некоторые исследования и попытаюсь улучшить ведение журнала.

4. Я считаю, что исправил проблему, изменив базовое изображение докера на node:14-alpine . Не знаю, почему это исправило проблему, но для тех, кто обнаружил эту проблему, стоит попробовать!

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