如何在重新启动或尝试失败后使用 compose 自动重新启动 docker 容器?

问题描述

我希望我的 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 编排器所做的唯一一件事就是识别容器发生故障并创建新容器来替换它。

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 一定的时间来轻松使用系统资源。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...