如何在BeagleBone Black的Docker容器中正常使用CAN总线
问题描述
我已经把运行在BeagleBone Black上的Node.js应用成功Docker化,但目前无法在Docker容器内部访问CAN总线。
注意:我已在宿主机上完成CAN端口的配置,运行candump命令可验证功能正常,执行命令如下:
candump can1
输出结果为:
can1 18FF30D0 [8] 00 00 00 00 00 00 00 00 can1 18FF02D0 [4] 00 00 00 00 can1 18FF21D0 [3] 00 00 00 can1 18FF3CD0 [4] 00 7D 28 7D can1 18FF30D0 [8] 00 03 00 00 00 00 00 00 can1 18FF02D0 [4] 00 00 00 00
我在Dockerfile中按如下方式构建SocketCAN Node.js模块:
# 如果还没有node/npm,先完成安装 RUN apk add --no-cache nodejs # 安装必要的构建和运行时依赖 RUN apk add --no-cache make gcc g++ python3 linux-headers udev RUN npm install
在容器内运行应用时抛出如下异常:
-- 🟡- 🚎 Canbus:can0: switched to channel "can0"… Pepsr v2.1.192 5:36:40 PM 📈 [pepsr-iingenierie] -- 🟡- 🚎 Canbus:can0: cancel CAN as other channel "can0" doesn’t work either Pepsr v2.1.192 5:36:40 PM 📈 [pepsr-iingenierie] -- 🔴- 🚎 Canbus:can0: Error: Error while creating channel at Object.exports.createRawChannel (/home/debian/Desktop/devel/iot/node_modules/socketcan/socketcan.js:38:12) at Canbus._connect (/home/debian/Desktop/devel/iot/pepsr.ddk.protocol.canBus.js:308:34) at Canbus.connect (/home/debian/Desktop/devel/iot/pepsr.module.js:272:9) at Object.<anonymous> (/home/debian/Desktop/devel/iot/pepsr.js:608:20) at Module._compile (internal/modules/cjs/loader.js:1015:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1035:10) at Module.load (internal/modules/cjs/loader.js:879:32) at Function.Module._load (internal/modules/cjs/loader.js:724:14) at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12) at internal/main/run_main_module.js:17:47
请问如何配置才能让CAN总线在Docker容器内正常运行?
解决方案
按以下步骤操作即可解决问题:
- 调整容器启动参数,共享宿主机网络并授予必要权限
启动容器时添加--net=host参数共享宿主机的网络栈,让容器可以直接访问宿主机的CAN接口;同时添加--cap-add=NET_ADMIN --cap-add=NET_RAW参数授予CAN操作所需的网络权限,无需开启全特权模式即可正常运行。如果对权限管控要求不高,也可以直接添加--privileged参数。
示例启动命令:docker run --net=host --cap-add=NET_ADMIN --cap-add=NET_RAW 你的镜像名称 - 修正应用的CAN接口配置
你宿主机正常可用的CAN接口是can1,但报错日志显示应用当前尝试连接的是can0,直接修改应用的CAN接口配置为can1即可,避免接口不匹配导致的连接失败。 - 提前验证容器层面的CAN可用性
可以在Dockerfile中新增一行安装can-utils调试工具:
容器启动后先执行RUN apk add --no-cache can-utilscandump can1验证是否能正常读取CAN报文,确认容器层面访问正常后再启动应用,方便快速定位问题。
内容的提问来源于stack exchange,提问作者Stéphane de Luca
相关产品推荐
相关产品推荐

