#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. Я только что обнаружил, что это изображение ненадежно. Я не гнался за решением, когда шел в другом направлении