gpt4 book ai didi

linux - Docker - 从 docker 容器中重启树莓派主机

转载 作者:太空狗 更新时间:2023-10-29 12:08:59 26 4
gpt4 key购买 nike

我有一个要在树莓派上运行的 python 应用程序。我创建了一个 docker-compose 文件来设置它,我的入口点恰好是一个 shell 脚本,用于检查主机上的各种内容,例如:

  1. 确保 SPI 已启用,如果未启用,则通过访问/boot/config.txt 并写入它来启用它。
  2. 安装并启用看门狗服务。
  3. 通过将我的 docker 容器写入/etc/rc.local 来在重新启动时自动运行它(尽管我正在考虑用 restart 替换它:docker-compose 文件中的 always or unless-stopped 标志)

问题是,如果我启用 SPI,树莓派需要重启才能设置它(不太清楚为什么),但是当我的 shell 脚本从 docker 容器中执行 sudo reboot 命令时,我收到以下错误:

 Failed to connect to bus: No such file or directory
Failed to talk to init daemon.

我知道它可能试图在 docker 容器中找到 dbus 和 init 守护进程,但它们不存在。如何让我的容器访问这些资源?我需要安装另一个卷吗?这是我的 docker-compose.yml 文件:

version: "3"

services:
mongoDB:
restart: unless-stopped
volumes:
- "/data/db:/data/db"
ports:
- "27017:27017"
- "28017:28017"
image: "andresvidal/rpi3-mongodb3:latest"
mosquitto:
restart: unless-stopped
ports:
- "1883:1883"
image: "mjenz/rpi-mosquitto"
FG:
privileged: true
network_mode: "host"
depends_on:
- "mosquitto"
- "mongoDB"
volumes:
- "/home/pi:/home/pi"
- "/boot:/boot"
#image: "arkfreestyle/fg:v1.8"
image: "test:latest"
entrypoint: /app/docker-entrypoint.sh
restart: unless-stopped

FG 是我的 python 应用程序,其入口点 docker-entrypoint.sh 如下所示:

#!/bin/sh
if [ ! -f /home/pi/.initialized ]; then
echo "Initializing..."

# Turn spi on
if grep -Fxq "dtparam=spi=on
dtparam=watchdog=on" /boot/config.txt
then
echo "\nSPI is already enabled"
echo "Creating .initialized"
# Create .initialized hidden file
touch /home/pi/.initialized
echo "Starting application..."
sudo python3 __main__.py -debug
else
### Enable SPI ###
fi
fi

### Create .initialized file ###
echo "Rebooting in ten seconds..."
sleep 10
sudo reboot # This line results in the error

else
echo "Initialized already!"
sudo python3 __main__.py -debug
fi

特权选项已经为我的容器提供了对 GPIO 的访问权限,我想它也可以让我重新启动,但似乎并非如此。请让我知道我需要做什么才能重新启动。

最佳答案

我的第一个猜测是您只需要将 /run/dbus/run/systemd 暴露给您的容器,如下所示:

docker run -v /run/dbus:/run/dbus -v /run/systemd:/run/systemd ...

虽然这是必要的,但还不够;仅使用这两个绑定(bind)安装,尝试从容器内部与主机 systemd 交互会导致:

[root@631fff40f09c /]# reboot
Failed to connect to bus: No data available
Failed to talk to init daemon.

事实证明,为了使其工作,容器必须在主机的全局 PID 命名空间中运行,这意味着我们需要:

docker run -v /run/dbus:/run/dbus -v /run/systemd:/run/systemd --pid=host ...

有了这个,在容器内运行 reboot 成功重启主机。

docker-compose.yml 中,它看起来像这样:

FG:
privileged: true
network_mode: "host"
pid: "host"
depends_on:
- "mosquitto"
- "mongoDB"
volumes:
- "/home/pi:/home/pi"
- "/boot:/boot"
- "/run/dbus:/run/dbus"
- "/run/systemd:/run/systemd"
image: "test:latest"
entrypoint: /app/docker-entrypoint.sh
restart: unless-stopped

关于linux - Docker - 从 docker 容器中重启树莓派主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55349923/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com