随机
Enter 搜索 ↑↓ 切换 Esc 清空

docker-buildx-clean

命令

清理 Docker Buildx 构建缓存

docker-buildx-clean

清理 Docker Buildx 构建缓存

补充说明

docker buildx 是 Docker 的扩展构建工具,支持多平台镜像构建、高级构建选项和构建缓存管理。本文覆盖 Buildx 缓存清理的完整操作,以及 Buildx 节点元数据索引错乱(No such container: buildx_buildkit_mybuilder00)的彻底修复方案。

Buildx 节点错乱修复(适配 FnOS)

一、问题现象

当前系统存在 Buildx 元数据与实际容器不匹配的顽固 Bug:

二、问题根因

Docker Buildx 在异常重启 / 强制删除容器后:

  1. 本地配置缓存残留了错误节点名称 mybuilder00
  2. 实际创建的容器节点为正常 mybuilder0
  3. docker-container 驱动的 buildx 会强制读取错误元数据,导致找不到容器报错

核心结论:服务是好的,只是 buildx 本地索引数据库错乱。

三、临时安全清理方案(日常使用 | 推荐)

无需重建、不破坏现有多架构构建器、永久规避报错,日常清理缓存固定使用这套流程:

# 1. 切换到系统默认内置构建器(无独立容器、无错乱bug)
docker buildx use default

# 2. 安全清理所有无引用构建缓存(不删除正在使用的层)
docker buildx prune -f

# 3. 切回你的多架构构建器,正常编译镜像
docker buildx use mybuilder

✅ 实测有效:清理无报错、缓存清零、不影响构建环境。

四、彻底根治修复方案(重置错乱索引)

如需彻底修复异常索引,以后 buildx prune 无需切换默认,执行完整重置流程:

# 1. 切换默认构建器
docker buildx use default

# 2. 删除损坏的自定义构建器
docker buildx rm mybuilder 2>/dev/null

# 3. 强制清理所有残留 buildkit 容器
docker rm -f $(docker ps -a --filter "name=^buildx_buildkit_" -q) 2>/dev/null

# 4. 全新创建干净无错乱的 buildx 构建器
docker buildx create --name mybuilder --driver docker-container --use

# 5. 初始化启动 BuildKit
docker buildx inspect mybuilder --bootstrap

# 6. 正常清理缓存(彻底无报错)
docker buildx prune -f

五、万能替代清理命令(绕开所有 Buildx Bug)

Docker 原生清理命令,不依赖 buildx 索引,100% 不会报错:

# 安全清理:仅删除未使用的构建缓存(推荐日常使用)
docker builder prune -f

# 深度清理:清空所有悬空/未引用缓存(适合磁盘爆满)
docker builder prune -a -f

# 清理当前 builder 全部缓存
docker buildx prune --all -f

六、最佳使用规范(后续永久不报错)

结合环境,固定工作流:

  1. 编译镜像:使用 mybuilder 多架构构建器
  2. 日常清理缓存:优先 docker builder prune -f
  3. 需要精准清理 buildx 缓存:切 default 清理再切回

七、当前环境状态总结

查看构建缓存使用情况

查看缓存大小

# 查看所有 Buildx 缓存的磁盘使用情况(推荐第一步操作)
docker buildx du

输出示例:

TYPE            TOTAL     ACTIVE    SIZE      DESCRIPTION
builder         1         0         78B       dockerfile build record
build-cache     2         0         256MB     build cache
Total:          3         0         256MB

详细查看缓存内容

# 查看更详细的缓存信息,包含构建记录
docker buildx du --verbose

# 过滤查看特定 builder 的缓存
docker buildx du --builder default

安全清理(推荐)

安全清理只删除无引用的缓存,已使用的构建层会被保留,后续构建仍能复用有效层。这是日常维护的首选方式。

删除无引用缓存

# 安全清理 — 删除所有无引用的构建缓存(不删除正在使用的层)
docker buildx prune -f

说明:

带过滤条件的清理

# 只清理 24 小时前的无引用缓存(更安全,保留近期缓存)
docker buildx prune -f --filter "until=24h"

# 清理 7 天前的缓存
docker buildx prune -f --filter "until=168h"

# 清理超过 1GB 的缓存(阈值清理)
docker buildx du  # 先查看大小,再决定是否清理
docker buildx prune -f --filter "max-size=1g"

一次性全部清空

执行后所有构建缓存将被删除,后续构建必须完全重新拉取依赖、逐层编译,构建速度会明显变慢。请确认无重要缓存需要保留。

删除全部构建缓存

# 清空所有 Buildx 构建缓存(包含所有无引用和已引用缓存)
docker buildx prune -a -f

警告:

清理 BuildKit 共享状态

# 清理 BuildKit 的共享内存和元数据(辅助彻底清理)
docker buildx prune -a -f --filter "all"

# 清理临时的构建输出文件
docker buildx prune -f --keep-storage 10GB  # 保留 10GB 缓存后再清理剩余

Windows PowerShell 脚本示例

# === 查看当前 Buildx 缓存大小 ===
Write-Host "=== Buildx 缓存使用情况 ===" -ForegroundColor Cyan
docker buildx du

# === 安全清理(保留有效层)===
Write-Host "`n=== 执行安全清理(仅删除无引用缓存)===" -ForegroundColor Yellow
docker buildx prune -f
docker buildx du

# === 确认清理结果 ===
Write-Host "`n=== 清理完成,当前缓存 ===" -ForegroundColor Green
docker buildx du

Linux/macOS 脚本示例

#!/bin/bash
# === docker-buildx-clean.sh ===
# Docker Buildx 构建缓存清理脚本

set -e

echo "=== Buildx 缓存使用情况 ==="
docker buildx du

echo ""
echo "=== 执行安全清理 ==="
docker buildx prune -f

echo ""
echo "=== 清理完成,当前缓存 ==="
docker buildx du
# 添加执行权限
chmod +x docker-buildx-clean.sh

# 手动执行
./docker-buildx-clean.sh

# 或添加到 crontab 定时执行(每周日凌晨 3 点)
# 0 3 * * 0 /path/to/docker-buildx-clean.sh >> /var/log/docker-buildx-clean.log 2>&1

CI/CD 中的使用

GitHub Actions

# .github/workflows/cleanup.yml
name: Cleanup Buildx Cache

on:
  schedule:
    - cron: '0 3 * * 0'  # 每周日凌晨 3 点
  workflow_dispatch:       # 允许手动触发

jobs:
  cleanup:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: View cache size
        run: docker buildx du

      - name: Safe prune
        run: docker buildx prune -f

      - name: Verify cleanup
        run: docker buildx du

GitLab CI

# .gitlab-ci.yml
stages:
  - cleanup

cleanup-buildx:
  stage: cleanup
  image: docker:24-cli
  services:
    - docker:24-dind
  script:
    - docker buildx du
    - docker buildx prune -f
    - docker buildx du
  only:
    - schedule

相关命令对比

命令 作用范围 是否保留有效层 适用场景
docker buildx prune -f Buildx 无引用缓存 ✅ 保留 日常维护首选
docker buildx prune -a -f Buildx 所有缓存 ❌ 全部删除 彻底重置磁盘空间
docker builder prune Classic builder 缓存 部分保留 非 Buildx 构建环境
docker system prune Docker 所有未用资源 部分保留 系统级清理
docker system prune -a Docker 所有未用资源 ❌ 全部删除 全面重置

常见问题

Q: docker buildx prunedocker builder prune 有什么区别?

A: docker buildx prune 清理 Buildx(BuildKit 后端)的缓存,存储在 buildx 目录;docker builder prune 清理传统 Docker builder 的缓存。推荐使用 Buildx 的项目使用 buildx prune

Q: 清理后构建速度变慢了?

A: 这是正常现象。缓存被清理后,构建需要重新执行每一步。如果不想完全禁用缓存,可以设置保留阈值:docker buildx prune -f --keep-storage 5GB,保留 5GB 缓存空间。

Q: 如何防止清理正在 CI 中使用的缓存?

A: 使用时间过滤保留近期缓存:docker buildx prune -f --filter "until=48h",只清理 48 小时前的无引用缓存。

Q: Windows 上缓存路径在哪里?

A: %LOCALAPPDATA%\Docker\buildx,也可以通过 docker buildx du --verbose 查看具体路径。

Q: 清理报错 "permission denied"?

A: 需要管理员/root 权限。在 Linux 上使用 sudo,或确保当前用户在 docker 用户组中。

Q: 报错 "No such container: buildx_buildkit_mybuilder00"?

A: Buildx 元数据索引错乱。实际容器为 mybuilder0 但本地缓存误记为 mybuilder00。使用临时方案:docker buildx use default && docker buildx prune -f && docker buildx use mybuilder。如需根治,执行彻底修复方案(见上方第四节)。

Q: docker buildx du 一直转圈不显示结果?

A: BuildKit 容器可能未正常运行。先执行 docker buildx inspect mybuilder --bootstrap 确认容器在线,然后重试。如果仍然卡住,说明 builder 元数据损坏,需重建 builder。