如何使得CAN总线在Docker容器内运行?

7

我成功地将我的nodejs应用程序放入了一个Beaglebone黑色板上的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节点模块:

 #If you don't have node/npm already, add that first
RUN apk add --no-cache nodejs

# Add the necessary build and runtime dependencies (see https://dev59.com/kZXfa4cB1Zd3GeqPeWU4)
RUN apk add --no-cache make gcc g++ python3 linux-headers udev

#RUN apk add --no-cache --virtual .gyp python3 make g++
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 
2个回答

4

感谢帮助我找到解决方案的贡献者。

我最终发现让容器能够访问主机CAN总线的最简单方法是使用以下--network参数:

$ docker run --rm --network=host <your image>

1

明白了。但是...我不知道如何在我的Debian主机上找到与Beaglebone黑色板载通信卡相当的/dev/canx。有什么想法吗? - Stéphane de Luca
1
Beaglebone CAN Shield是一种网络设备。您可以使用ifconfig找到它。 - Shabbir Hussain
1
啊,抱歉 - 我不知道它是一个网络接口。在这种情况下,需要更多的操作。请参见 https://dev59.com/D7zpa4cB1Zd3GeqPIVDB - Tarmo
我可以在ifconfig中看到can1,但是如何提供--device所要求的绝对路径给can1呢?(/dev/can1不存在) - Stéphane de Luca
1
忽略我之前的回答,它仅适用于设备文件。网络接口不是这样工作的。请检查我粘贴的链接。 - Tarmo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接