我希望我的 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
会这样做,但显然我错了。
答案 0 :(得分:0)
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
一定的时间来轻松使用系统资源。