You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 23:50:13