如何让 CAN 总线在 docker 容器内运行?

Sté*_*uca 7 can-bus node.js docker beagleboneblack

我成功地对在 Beaglebone black 上运行的 Nodejs 应用程序进行了 docker 化。但现在我想从 docker 容器内访问 CAN,但它不起作用。

\n

请注意,我成功地在主机中配置了 CAN 端口,并且 candump 显示它可以工作。

\n
$ candump can1\n  can1  18FF30D0   [8]  00 00 00 00 00 00 00 00\n  can1  18FF02D0   [4]  00 00 00 00\n  can1  18FF21D0   [3]  00 00 00\n  can1  18FF3CD0   [4]  00 7D 28 7D\n  can1  18FF30D0   [8]  00 03 00 00 00 00 00 00\n  can1  18FF02D0   [4]  00 00 00 00\n
Run Code Online (Sandbox Code Playgroud)\n

我在 Dockerfile 中构建了 socketcan 节点模块,如下所示:

\n
 #If you don't have node/npm already, add that first\nRUN apk add --no-cache nodejs\n\n# Add the necessary build and runtime dependencies (see /sf/ask/2534146681/)\nRUN apk add --no-cache make gcc g++ python3 linux-headers udev\n\n#RUN apk add --no-cache --virtual .gyp python3 make g++\nRUN  npm install \n
Run Code Online (Sandbox Code Playgroud)\n

从容器运行我的应用程序后,我收到以下异常:

\n
 -- -  Canbus:can0: switched to channel "can0"\xe2\x80\xa6\nPepsr v2.1.192 5:36:40 PM  [pepsr-iingenierie]  -- -  Canbus:can0: cancel CAN as other channel "can0" doesn\xe2\x80\x99t work either\nPepsr v2.1.192 5:36:40 PM  [pepsr-iingenierie]  -- -  Canbus:can0: Error: Error while creating channel\n    at Object.exports.createRawChannel (/home/debian/Desktop/devel/iot/node_modules/socketcan/socketcan.js:38:12)\n    at Canbus._connect (/home/debian/Desktop/devel/iot/pepsr.ddk.protocol.canBus.js:308:34)\n    at Canbus.connect (/home/debian/Desktop/devel/iot/pepsr.module.js:272:9)\n    at Object.<anonymous> (/home/debian/Desktop/devel/iot/pepsr.js:608:20)\n    at Module._compile (internal/modules/cjs/loader.js:1015:30)\n    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1035:10)\n    at Module.load (internal/modules/cjs/loader.js:879:32)\n    at Function.Module._load (internal/modules/cjs/loader.js:724:14)\n    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12)\n    at internal/main/run_main_module.js:17:47 \n
Run Code Online (Sandbox Code Playgroud)\n

Sté*_*uca 4

感谢引导我找到解决方案的贡献者。

最后发现让容器访问主机CAN总线最简单的方法就是使用--network如下参数:

$ docker run --rm --network=host <your image>
Run Code Online (Sandbox Code Playgroud)