docker - 如何在重启或尝试失败后自动重启带有 compose 的 docker 容器?

标签 docker docker-compose usb reboot

我希望我的 docker 容器 deconz 在重启或容器启动失败后重新启动。

我的撰写文件是

version: "3.3"
services:
  deconz:
    image: marthoc/deconz
    container_name: deconz
    network_mode: host
    restart: "always"
    volumes:
      - /sharedfolders/media/AppData/deconz:/root/.local/share/dresden-elektronik/deCONZ
    devices:
      - /dev/ttyACM0
    environment:
      - DECONZ_WEB_PORT=8083
      - DECONZ_WS_PORT=8443
      - DEBUG_INFO=1
      - DEBUG_APS=0
      - DEBUG_ZCL=0
      - DEBUG_ZDP=0
      - DEBUG_OTAU=0

我使用命令 docker-compose up -d 来启动容器。现在我假设在重新启动后容器在识别 USB 设备之前启动。我希望 docker 继续尝试重启直到成功。我假设 restart: alwaysrestart: unless-stopped 会这样做,但显然我错了。

最佳答案

Docker (docker-compose) 不会直接帮助您完成这项任务。 docker orchestrator 唯一要做的就是识别容器失败并创建新容器来替换它。

其他协调器(如 Kubernetes)通过允许协调器识别容器的内部状态,改进了生命周期的处理。基于内部状态,编排器将管理该容器的生命周期以及相关容器的生命周期。

在您的特定情况下,即使只是转移到 Kubernetes 也不会真正帮助您,因为容器的任务是识别他是否已准备好开始工作的所有资源。

您需要做的是为容器创建一个启动脚本,该脚本将识别所有必需的资源都已准备就绪,并且可以继续启动。当你准备脚本时,你可以选择等待一定时间后退出脚本(此时Docker会检测为容器故障并根据重启规则进行处理)或者永远等待,直到资源准备好。我更喜欢等待一段时间然后在资源仍未准备好时失败的方法。这使管理员更容易识别容器不健康。

脚本的最简单示例是:

testfile="/dev/usbdrive/Iamthedrive.txt"
while :
do
  if [ -e "$testfile" ]
  then
    echo "drive is mounted."
    start_the_container_main_process.sh
    exit(0)
  fi
  echo "drive is still not ready, waiting 10s"
  sleep(10)
done

确保您有一定的 sleep 时间,以便轻松使用系统资源。

关于docker - 如何在重启或尝试失败后自动重启带有 compose 的 docker 容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66365383/

相关文章:

Linux无法检测到Altera FPGA

docker - 为什么我的docker build命令失败并出现 “invalid id”错误?

mysql - Kubernetes:使用 MySQL 容器创建 StatefulSet 时出错

postgresql - Docker-Compose Postgresql 导入转储

docker-compose - Traefik 2 网关超时

php - 如何在单个Docker容器上安装多个php版本

azure - 在 Docker 文件中挂载 Azure Blob 存储

docker - 错误 : unable to perform an operation on node 'rabbit@localhost'

sockets - 数据传输Windows Embedded Compact 7和计算机VIA USB连接

c - 如何枚举 USB 设备*和*读取/写入它们?