#!/usr/bin/env bash # prepull-actions.sh —— 在 Gitea Actions runner 主机上预拉所有 workflow 用到的 Docker 镜像 # # 目的:避免每次 workflow run 都要从 Docker Hub 拉镜像("Set up job" 慢的根因) # 时机:runner 初始化时、worker count 变更后、Job 出现新 action 镜像时 # 频率:按需;用 docker images 定期看是否有未缓存的镜像 # # 用法: # chmod +x scripts/prepull-actions.sh # sudo ./scripts/prepull-actions.sh # # 镜像列表来源:.gitea/workflows/build-image.yml # 更新规则:每次 workflow 增删 action 时同步更新本脚本 set -euo pipefail # 各 action 实际使用的 Docker 镜像(按 workflow 用到的 step 列出) IMAGES=( # actions/checkout@v4 → 内置 Node 脚本,非 Docker 镜像(不需预拉) # dtolnay/rust-toolchain@stable → 内置安装,非 Docker 镜像(不需预拉) # Swatinem/rust-cache@v2 → 内置 action,非 Docker 镜像(不需预拉) # docker/setup-buildx-action@v3 "docker/actions/setup-buildx:v3" # docker/login-action@v3 "docker/actions/login:v3" # docker/metadata-action@v5 "docker/actions/metadata:v5" # docker/build-push-action@v5 "docker/actions/build-push:v5" # aquasecurity/trivy-action@master "aquasec/trivy-action:master" # buildx builder 推荐基础镜像(cache 导出/导入格式) "moby/buildkit:v0.13.0" ) echo "==> 准备预拉 ${#IMAGES[@]} 个镜像" echo # 并行拉取(最多 4 个并发) printf '%s\n' "${IMAGES[@]}" | xargs -n 1 -P 4 -I {} \ sh -c 'echo "拉取: {}"; docker pull --quiet "{}" || echo " 失败: {}"' echo echo "==> 完成。验证缓存:" docker images --format "table {{.Repository}}:{{.Tag}}\t{{.Size}}" | grep -E "(docker/actions|aquasec/trivy-action|moby/buildkit)" || true echo echo "==> 镜像保留策略建议:" echo " /etc/docker/daemon.json 添加:" cat <<'EOF' { "features": {"containerd-snapshotter": false}, "storage-driver": "overlay2" } EOF echo echo " 配合 cron 定期清理悬空镜像:" echo " 0 3 * * 0 docker image prune -f --filter \"until=168h\""