Docker Django GPIO Raspbian 克星

Docker Django GPIO Rasbian buster

我是 Docker 的初学者,所以请放轻松。

我正在尝试在 Raspberry Pi 3B 上的 Docker 容器中部署 Django 项目,但我 运行 在访问 GPIO 端口时遇到问题。

每次我尝试用“sudo docker-compose up”初始化Docker 我收到错误:“RuntimeError:无法访问 /dev/mem。以 root 身份尝试 运行!”

根据我的阅读,为了让 Docker 容器与 GPIO 端口通信,“用户”必须是“gpio”组的一部分。

我的问题是:

  1. 如何通过 Docker 文件或 docker-compose.yml 使用户成为 GPIO 组的成员?
  2. 是否有更好的方法从 Docker 访问 GPIO 端口?

Docker 文件:

FROM python:3.8-alpine

ENV PATH="/scripts:${PATH}"

COPY ./requirements.txt /requirements.txt
RUN apk add --update --no-cache --virtual .tmp gcc libc-dev linux-headers
RUN pip install -r /requirements.txt
RUN pip install RPi.GPIO
RUN pip install apscheduler
RUN apk del .tmp

RUN mkdir /poolproject

COPY ./poolproject /poolproject
WORKDIR /poolproject
COPY ./scripts /scripts

RUN chmod +x /scripts/*

RUN mkdir -p /vol/web/media
RUN mkdir -p /vol/web/static

RUN adduser -D user
RUN chown -R user:user /vol

RUN chmod -R 755 /vol/web
USER user

CMD ["entrypoint.sh"]

docker-compose.yml

version: '3.7'

services:
  app:
    privileged: true
    build:
      context: .
    ports:
      - "8000:8000"
    volumes:
      - ./poolproject:/poolproject
    command: sh -c "python manage.py runserver 0.0.0.0:8000"
    environment:
      - DEBUG=1

对不起;我收回了我之前的回答,因为我错过了你的 docker-compose.yml 中已经有 privileged: true 的事实。你遇到了不同的问题。

首先,来自 RPi.GPIO 的错误具有误导性:它并不是真的想要访问 /dev/mem;它想要访问 /dev/gpiomem,它在主机上具有以下权限:

pi@raspberrypi:~ $ ls -l /dev/gpiomem
crw-rw---- 1 root gpio 246, 0 Sep  7 09:02 /dev/gpiomem

gpio 组的 gid 997:

pi@raspberrypi:~ $ getent group gpio
gpio:x:997:pi

这意味着我们需要将您的 Web 服务安排到 运行,gid 997 在您的容器内。我们可以通过在您的 Dockerfile 中添加 gpio 组,然后让您的 user 成为该组的成员来做到这一点:

RUN addgroup -g 997 gpio
RUN adduser -D -G gpio user

通过此更改,我可以 运行 我的一些测试代码没有错误。此外,不再需要启用 privileged 模式;我们可以用 devices 条目替换 docker-compose.yml 中的 privileged: true 以仅公开 /dev/gpiomem 设备。

测试环境

这是我用来测试情况的​​所有内容。

这是我的 Dockerfile:

FROM python:3.8-alpine

RUN apk add --update --no-cache --virtual .tmp gcc libc-dev linux-headers
RUN pip install RPi.GPIO

RUN addgroup -g 997 gpio
RUN adduser -D -G gpio user

RUN mkdir -p /scripts
RUN chown -R user:gpio /scripts
COPY gpiotest.py /scripts/gpiotest.py
RUN chmod 755 /scripts/gpiotest.py

CMD python /scripts/gpiotest.py
USER user

这是我的 docker-compose.yml:

version: '3.7'

services:
  app:
    build:
      context: .
    devices:
      - /dev/gpiomem:/dev/gpiomem

这是我的 gpiotest.py 脚本:

#!/usr/bin/python

import sys
import time

import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN)

while True:
    val = GPIO.input(17)
    print('value:', val)
    sys.stdout.flush()
    time.sleep(1)