我希望我的 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: always
或 restart: 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/