Press "Enter" to skip to content

通过定时任务脚本监控docker容器状态

我有个容器提供一些底层能力,希望他和系统一起启动,如果是不健康就重新创建他。

我的容器配置大概是这个样子。

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

这样,我就实现了这个容器的正常运行的守护。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注