RPi4多Docker容器同时访问不同GPIO引脚故障排查求助
解决Docker容器同时监听树莓派不同GPIO中断的问题
问题核心
单独运行容器时GPIO中断正常,但同时运行两个分别监听GPIO23和GPIO17的容器时无法正常触发中断,需要实现两个容器的中断可任意时刻触发。
解决方案
1. 修正Python代码(添加主循环)
原代码缺少主循环,容器启动后程序会立即退出,无法持续监听中断。修改后的代码如下:
容器1(监听GPIO23)代码:
import RPi.GPIO as GPIO import time M_PIN = 23 GPIO.setmode(GPIO.BCM) GPIO.setup(M_PIN, GPIO.IN) GPIO.setwarnings(False) def my_callback(M_PIN): if GPIO.input(M_PIN) == GPIO.HIGH: print("PIN 23 HIGH") elif GPIO.input(M_PIN) == GPIO.LOW: print("PIN 23 LOW") GPIO.add_event_detect(M_PIN, GPIO.BOTH, callback=my_callback, bouncetime=50) # 主循环保持程序运行,捕获中断时清理GPIO资源 try: while True: time.sleep(1) except KeyboardInterrupt: GPIO.cleanup()
容器2(监听GPIO17)代码:
import RPi.GPIO as GPIO import time M_PIN = 17 GPIO.setmode(GPIO.BCM) GPIO.setup(M_PIN, GPIO.IN) GPIO.setwarnings(False) def my_callback(M_PIN): if GPIO.input(M_PIN) == GPIO.HIGH: print("PIN 17 HIGH") elif GPIO.input(M_PIN) == GPIO.LOW: print("PIN 17 LOW") GPIO.add_event_detect(M_PIN, GPIO.BOTH, callback=my_callback, bouncetime=50) # 主循环保持程序运行,捕获中断时清理GPIO资源 try: while True: time.sleep(1) except KeyboardInterrupt: GPIO.cleanup()
2. 修正并优化docker-compose配置
- 修正镜像名错误(确保镜像与对应引脚代码匹配)
- 显式挂载GPIO相关系统路径,避免权限访问问题
- 添加自动重启策略(可选)
version: '3' services: container1: image: gpio23-image # 替换为你构建的对应GPIO23代码的镜像名 privileged: true volumes: - /sys/class/gpio:/sys/class/gpio - /dev/gpiochip0:/dev/gpiochip0 restart: unless-stopped container2: image: gpio17-image # 替换为你构建的对应GPIO17代码的镜像名 privileged: true volumes: - /sys/class/gpio:/sys/class/gpio - /dev/gpiochip0:/dev/gpiochip0 restart: unless-stopped
3. 构建容器镜像的Dockerfile示例
以GPIO23容器为例,Dockerfile需确保安装RPi.GPIO依赖:
FROM python:3.9-slim-bullseye RUN apt-get update && apt-get install -y --no-install-recommends \ gcc \ python3-dev \ && pip install RPi.GPIO \ && apt-get clean && rm -rf /var/lib/apt/lists/* COPY container1_code.py /app/run.py CMD ["python", "/app/run.py"]
构建镜像命令:
docker build -t gpio23-image .
同理构建gpio17-image镜像。
关键说明
- 主循环是保持容器运行的核心,否则程序执行完
add_event_detect后会立即退出,无法监听中断。 - 显式挂载
/sys/class/gpio和/dev/gpiochip0确保容器能直接访问GPIO子系统,避免privileged模式下的潜在访问问题。 - 镜像名需与实际构建的镜像对应,避免代码与引脚不匹配的错误。
内容的提问来源于stack exchange,提问作者dougy
相关产品推荐
相关产品推荐

