在ai协助下写了一个检查docker的latest版本更新,通过比较digest实现,并发送钉钉通知,如果有更新强迫症的可以拿去直接用或者自己修改,脚本中会用到regclient这个工具,也是github开源项目
#!/bin/bashOS="$(uname -s | tr '[:upper:]' '[:lower:]')"ARCH="$(uname -m)"case "$ARCH" inx86_64 | amd64) ARCH="amd64" ;;arm64 | aarch64) ARCH="arm64" ;;*) echo "不支持的架构: $ARCH" exit 1 ;;esacREGCTL_BIN="./regctl"REGCTL_URL="https://github.com/regclient/regclient/releases/download/v0.11.0/regctl-$OS-$ARCH"if [[ ! -x "$REGCTL_BIN" ]]; then echo "当前目录没有 regctl,正在下载..." curl -L -o "$REGCTL_BIN" "$REGCTL_URL" || { echo "下载失败,请手动下载 $REGCTL_URL" exit 1 } chmod +x "$REGCTL_BIN" echo "下载完成,已赋予执行权限: $REGCTL_BIN"fi# --- 检查依赖 ---command -v docker >/dev/null 2>&1 || { echo "请先安装 docker" exit 1}command -v "$REGCTL_BIN" >/dev/null 2>&1 || { echo "regctl 不可执行" exit 1}updates=()# 获取本地镜像列表(不包含中间镜像)mapfile -t images < <(docker images --format "{{.Repository}}:{{.Tag}}" | grep -v "<none>" | grep ":latest$")echo "检测本地 Docker 镜像最新版本..."echofor img in "${images[@]}"; do echo "镜像: $img" # 获取本地 digest local_digest=$(docker image inspect "$img" --format '{{index .RepoDigests 0}}' 2>/dev/null | cut -d'@' -f2 || echo "") if [[ -z "$local_digest" ]]; then echo " 本地无 digest (可能是中间层镜像), 跳过" continue fi # 获取远程 digest remote_digest=$("$REGCTL_BIN" image digest "$img" 2>/dev/null || echo "") if [[ -z "$remote_digest" ]]; then echo " 获取远程 digest 失败,可能镜像不存在于公共 registry" continue fi # 对比 digest if [[ "$local_digest" == "$remote_digest" ]]; then echo " 已是最新版本" else echo " 有更新可用" echo " 本地 digest: $local_digest" echo " 远程 digest: $remote_digest" updates+=("$img") fi echodoneif [[ ${#updates[@]} -gt 0 ]]; then # 拼接消息内容 message="vps警告,以下 Docker 镜像有更新可用:\n$(printf '%s\n' "${updates[@]}")" msg="{\"msgtype\": \"text\",\"text\": {\"content\": \"$message\"},\"at\": {\"isAtAll\": false}}" curl -s "https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxx" \ -H 'Content-Type: application/json' \ -d "$msg" >/dev/null echo "已发送钉钉通知"else echo "所有镜像均为最新,无需通知"fi
脚本中的钉钉token做了脱敏处理,自行修改或者换成其他通知形式,可以设置到crontab任务中定时检查,代码临时写的比较粗糙,使用中有什么小bug大家自行修改吧
crontab -e
评论 (0)