在 Docker 容器内访问 raspistill / pi 相机

pgr*_*ues 5 node.js raspberry-pi docker dockerfile

我一直在使用 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"]
Run Code Online (Sandbox Code Playgroud)

然后在 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]

使用该命令,我得到:

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

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

小智 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
Run Code Online (Sandbox Code Playgroud)

这里有3个要点:

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

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