树莓派Docker Swarm部署GPIO应用遇/dev/mem权限问题求助
问题原因分析
你遇到的核心问题是:Docker Swarm 服务默认不会自动挂载宿主机的特殊设备,哪怕开启了privileged: true。
在你用docker run命令时,显式通过--device /dev/gpiomem参数把宿主机的/dev/gpiomem设备直接映射到了容器内部,容器里的进程才能正常访问这个GPIO设备文件。但在Swarm部署的docker-compose.yml中,你只配置了privileged: true,却没有声明要挂载这个设备,所以容器内部根本看不到/dev/gpiomem,自然会报"No access to /dev/mem"的错误(这里的错误提示其实有点误导,本质是设备不存在或者无法访问)。
解决办法
修改你的docker-compose.yml文件,在app服务下添加devices配置项,显式映射/dev/gpiomem设备:
version: "3" services: app: image: app-image deploy: mode: global restart: always privileged: true devices: - /dev/gpiomem:/dev/gpiomem
然后重新部署服务:
sudo docker stack deploy -c docker-compose.yml <stack-name>
额外说明
- 关于
privileged: true:这个配置会让容器获得宿主机的几乎所有权限,但它本身不会自动挂载宿主机的设备,只是让容器内的进程有权限访问已挂载的设备。 - 无需手动
chmod 777 /dev/gpiomem:宿主机上的/dev/gpiomem默认权限是crw-rw----,属于root用户和gpio组。在privileged模式下,容器内的进程以root身份运行,已经拥有访问该设备的权限,不需要额外修改权限。 - 全局模式的适配:因为你用了
mode: global,每个Swarm节点都会运行这个服务,确保每个节点上的/dev/gpiomem设备都存在(也就是所有节点都是树莓派或支持GPIO的设备),否则在没有该设备的节点上服务会启动失败。
内容的提问来源于stack exchange,提问作者User272727
相关产品推荐
相关产品推荐

