node.js - 如何修复在 Balena 上运行的树莓派 3 上的无效 ELF 标头错误?
问题描述
我正在尝试使用rpio库转换 Node.js 应用程序,以在本地模式下在Balena支持的 Raspberry Pi 3 上运行。换句话说,我希望通过 Nodejs+Docker+Balena 来控制树莓派上的 GPIO。
我Dockerfile
安装了 gcc-4.8 支持,作为 rpio 库的依赖项。容器构建没有任何问题。但是当节点进程启动时,它会抛出错误invalid ELF header:
17:50:00 - error: uncaughtException: /usr/src/app/node_modules/rpio/build/Release/rpio.node: invalid ELF header
为了调试错误是否与平台架构相关,我RUN uname -a
在 dockerfile 和节点的应用程序代码中都添加了该命令。相应地返回以下内容:
(Dockerfile)Linux 96cbf2e6ef3d 4.14.68 #1 SMP Tue Nov 27 09:53:28 UTC 2018 armv7l GNU/Linux
(Node file) Linux 2cfca32 4.14.68 #1 SMP Tue Nov 27 09:53:28 UTC 2018 armv7l GNU/Linux
我很难从这里弄清楚该怎么做,因为架构似乎匹配。
Dockerfile
FROM resin/raspberrypi3-node:8
# use apt-get if you need to install dependencies,
# for instance if you need ALSA sound utils, just uncomment the lines below.
RUN apt-get update && apt-get install -yq \
alsa-utils libasound2-dev gcc-4.8 g++-4.8 && \
apt-get clean && rm -rf /var/lib/apt/lists/*
RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50 && \
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50
RUN gcc --version
# Defines our working directory in container
WORKDIR /usr/src/app
# Copies the package.json first for better cache on later pushes
COPY package.json package.json
# COPY package-lock.json package-lock.json
# This install npm dependencies on the balena build server,
# making sure to clean up the artifacts it creates in order to reduce the image size.
RUN JOBS=MAX npm install --production --unsafe-perm && rm -rf /tmp/*
RUN uname -a
# This will copy all files in our root to the working directory in the container
COPY . ./
# Enable systemd init system in container
ENV INITSYSTEM on
# server.js will run when container starts up on the device
CMD ["npm", "start"]
包.json
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"setup-log": "touch logs/app.log",
"prestart": "bash ./deps.sh",
"start": "npm run -s setup-log && node skaale/index.js"
},
"dependencies": {
"cron": "^1.2.1",
"firebase-admin": "^6.4.0",
"moment": "^2.18.1",
"request": "^2.88.0",
"request-promise": "^4.2.0",
"rimraf": "^2.6.2",
"rpio": "^1.0.11",
"winston": "^2.3.1",
"winston-daily-rotate-file": "^1.4.6"
}
完整的错误堆栈
[ 'Error: /usr/src/app/node_modules/rpio/build/Release/rpio.node: invalid ELF header',
' at Object.Module._extensions..node (module.js:681:18)',
' at Module.load (module.js:565:32)',
' at tryModuleLoad (module.js:505:12)',
' at Function.Module._load (module.js:497:3)',
' at Module.require (module.js:596:17)',
' at require (internal/module.js:11:18)',
' at bindings (/usr/src/app/node_modules/bindings/bindings.js:81:44)',
' at Object.<anonymous> (/usr/src/app/node_modules/rpio/lib/rpio.js:17:34)',
' at Module._compile (module.js:652:30)',
' at Object.Module._extensions..js (module.js:663:10)',
' at Module.load (module.js:565:32)',
' at tryModuleLoad (module.js:505:12)',
' at Function.Module._load (module.js:497:3)',
' at Module.require (module.js:596:17)',
' at require (internal/module.js:11:18)',
' at Object.<anonymous> (/usr/src/app/utils/gpioHelper.js:5:12)',
' at Module._compile (module.js:652:30)',
' at Object.Module._extensions..js (module.js:663:10)',
' at Module.load (module.js:565:32)',
' at tryModuleLoad (module.js:505:12)',
' at Function.Module._load (module.js:497:3)',
' at Module.require (module.js:596:17)' ] }
解决方案
我认为问题在于需要在主机上创建节点模块。因为您在 docker 中运行,所以您需要忽略过时的 node_modules 以便动态创建 rpio 模块,因为它依赖于硬件。我所要做的就是添加一个带有“node_modules”的 .dockerignore 并正确编译。
不确定复制 package-lock.json 会如何影响这一点。
希望能帮助到你,