在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