我有个容器提供一些底层能力,希望他和系统一起启动,如果是不健康就重新创建他。
我的容器配置大概是这个样子。
version: '3.6'
services:
client:
environment:
image: client
healthcheck:
test: ["CMD", "curl", "-f", "http://192.168.0.1"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 40s
restart: always
privileged: true
network_mode: host
logging:
options:
max-size: "10m"
max-file: "10"
我这个容器是用来提供网络打通的能力,如果 尝试访问 http://192.168.0.1 不通,则可以认为服务不健康。
我这里加了个健康检查,由于我是在mac系统上面运行的docker单节课,这个监控检查只会帮我做检查,并把容器状态标注出来,他并不会帮我做重启等操作。
我的判断目标是,如果这个容器是 healthy 或者是 starting,那么我认为容器的状态是OK的,就不用管它。如果是其他状态,或者这个容器不存在,我就去尝试重新创建他。
我写了个这样的脚本:
#!/bin/bash
source /etc/profile
check_container () {
if [[ $(docker ps -f "label=com.docker.compose.service=client" -f health=$1 --format "{{.Status}}") ]]; then
echo "docker container is $1"
return 1
else
if [[ $(docker ps -f "label=com.docker.compose.service=client" -f health=$2 --format "{{.Status}}") ]]; then
echo "docker container is $2"
return 1
else
echo "docker container is not $1 and not $2"
return 0
fi
fi
}
check_container healthy starting
check_status=$?
echo "container check result: $check_status"
if [[ "$check_status" -eq "0" ]]; then
echo "container check failed. try to recreate it"
docker-compose -f /Users/apple/Documents/client/docker-compose.yml down
docker-compose -f /Users/apple/Documents/client/docker-compose.yml up -d
else
echo "container check ok."
fi
然后我增加了个定时任务
*/1 * * * * bash /Users/apple/Documents/client_health_check.sh >> /Users/apple/Documents/cient_health_check.log 2>&1
这样,我就实现了这个容器的正常运行的守护。