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”组的一部分。
我的问题是:
- 如何通过 Docker 文件或 docker-compose.yml 使用户成为 GPIO 组的成员?
- 是否有更好的方法从 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)
我是 Docker 的初学者,所以请放轻松。
我正在尝试在 Raspberry Pi 3B 上的 Docker 容器中部署 Django 项目,但我 运行 在访问 GPIO 端口时遇到问题。
每次我尝试用“sudo docker-compose up”初始化Docker 我收到错误:“RuntimeError:无法访问 /dev/mem。以 root 身份尝试 运行!”
根据我的阅读,为了让 Docker 容器与 GPIO 端口通信,“用户”必须是“gpio”组的一部分。
我的问题是:
- 如何通过 Docker 文件或 docker-compose.yml 使用户成为 GPIO 组的成员?
- 是否有更好的方法从 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)