【问题标题】:Access raspistill / pi camera inside a Docker container访问 Docker 容器内的 raspistill / pi 摄像头
【发布时间】:2019-10-20 01:47:35
【问题描述】:

我一直在使用 Docker 在 Raspberry Pi 3 Model B 上试用我的 Node.js 应用程序,它运行起来没有任何问题。

当应用依赖项 (raspicam) 需要 raspistill 使用相机拍照时,就会出现问题。 Raspberry 正在运行 Debian Stretch,并且 pi 摄像头已配置和测试。但是通过 Docker 运行应用程序时我无法访问它。

基本上,我使用这个 Dockerfile 在 win10 64 位机器上使用 Docker Desktop 构建映像:

FROM arm32v7/node:10.15.1-stretch

ENV PATH /opt/vc/bin:/opt/vc/lib:$PATH

RUN echo "/opt/vc/lib" > /etc/ld.so.conf.d/00-vcms.conf \
    && ldconfig

# Create the app directory
ENV APP_DIR /home/app
RUN mkdir $APP_DIR
WORKDIR $APP_DIR

# Copy both package.json and package-lock.json
COPY package*.json ./

# Install app dependencies
RUN npm install

# Bundle app source
COPY . .

EXPOSE 3000

CMD ["npm", "start"]

然后在 Raspberry 中,如果我拉取图像并运行它:

docker run --privileged --device=/dev/vchiq -p 3000:3000 [my/image:latest]

我明白了:

错误:产生 /opt/vc/bin/raspistill ENOENT

经过一番研究,我也尝试过运行:

docker run --privileged -v=/opt/vc/bin:/opt/vc/bin --device=/dev/vchiq -p 3000:3000 [my/image:latest]

通过该命令,我得到:

stderr:/opt/vc/bin/raspistill:加载共享库时出错:libmmal_core.so:无法打开共享对象文件:没有这样的文件或目录

有人可以分享一些关于我必须对 Dockerfile 进行哪些更改以便能够从 Docker 容器内部访问 pi 摄像头的想法吗?提前致谢。

【问题讨论】:

  • 如果您需要运行--privileged 容器来访问主机设备和主机二进制文件,那么完全不使用 Docker 会更容易且安全。 /opt/vc 树在你的 Docker 镜像中是空的,当你运行 ldconfig 它没有任何效果。
  • @DavidMaze 我只使用--privileged 运行,因为我找不到另一种访问GPIO 的方法,即使使用--device=/dev/gpiomem
  • 这个文件/opt/vc/bin/raspistill应该在哪里?它是否已经在您的 Raspberry 中,或者您想使用卷将该文件从图像内部带到 Raspberry 文件夹中?
  • @ManishDash 在我的树莓上我可以访问那个目录并且 raspistill 在那里。
  • @user3632710 你解决了吗?

标签: node.js docker raspberry-pi dockerfile


【解决方案1】:

我在尝试使用 docker 容器中的相机接口时遇到了同样的问题。有了这个线程中的建议,我设法让它与下面的 dockerfile 一起工作。

FROM node:12.12.0-buster-slim

EXPOSE 3000

ENV PATH="$PATH:/opt/vc/bin"

RUN echo "/opt/vc/lib" > /etc/ld.so.conf.d/00-vcms.conf

COPY "node_modules" "/usr/src/app/node_modules"
COPY "dist" "/usr/src/app"

CMD ldconfig && node /usr/src/app/app.js

这里有3个要点:

  1. /opt/vc/bin 添加到您的PATH,这样您就可以在不引用完整路径的情况下调用raspistill
  2. /opt/vc/lib 添加到您的配置文件中,以便raspistill 可以找到它需要的所有依赖项。
  3. 在容器运行时而不是构建时重新加载配置文件 (ldconfig)。

最后一点是安东的解决方案不起作用的主要原因。 ldconfig 需要在一个正在运行的容器中执行,所以要么使用类似的方法来挖掘,要么使用 entrypoint.sh 文件。

【讨论】:

    【解决方案2】:

    尝试从 Dockerfile 中替换它:

    RUN echo "/opt/vc/lib" > /etc/ld.so.conf.d/00-vcms.conf \
    && ldconfig
    

    以下内容:

    ADD 00-vmcs.conf /etc/ld.so.conf.d/
    RUN ldconfig
    

    并创建文件00-vmcs.conf

    /opt/vc/lib
    

    编辑

    如果仍然无法正常工作,请尝试加载 Raspbian Docker 映像,例如 balenalib/rpi-raspbian

    FROM balenalib/rpi-raspbian
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多