Dive Docker 镜像层分析工具教程

Docker 镜像由多个层(Layer)叠加组成,每一层对应 Dockerfile 中的一条指令。如果不仔细优化,镜像中可能包含大量不必要的文件,导致体积膨胀。Dive 是一款专门用于探索和分析 Docker 镜像层的终端工具,它能直观地展示每一层的内容变化,帮助你发现镜像中浪费的空间并进行优化。本文介绍如何在搬瓦工 VPS 上安装和使用 Dive。

一、安装 Dive

1.1 下载二进制文件

DIVE_VERSION=$(curl -s https://api.github.com/repos/wagoodman/dive/releases/latest | grep -Po '"tag_name": "v\K[^"]*')
curl -Lo dive.deb "https://github.com/wagoodman/dive/releases/download/v${DIVE_VERSION}/dive_${DIVE_VERSION}_linux_amd64.deb"
dpkg -i dive.deb
rm dive.deb

# 验证安装
dive --version

1.2 通过 Docker 运行

docker run --rm -it \
  -v /var/run/docker.sock:/var/run/docker.sock \
  wagoodman/dive:latest myimage:tag

二、基本使用

# 分析本地镜像
dive nginx:latest

# 分析并构建镜像(一步完成)
dive build -t myapp:latest .

# 分析远程镜像(无需先拉取)
dive docker.io/library/nginx:latest

三、界面操作

Dive 的界面分为左右两个面板:

  • 左侧面板:显示镜像的所有层,每一层对应 Dockerfile 中的一条指令。
  • 右侧面板:显示选中层的文件系统变化(新增、修改、删除的文件)。

常用快捷键:

  • Tab:在左右面板之间切换。
  • ↑/↓:在层列表或文件列表中移动。
  • Space:展开/折叠文件目录树。
  • Ctrl+A:切换显示所有文件或仅显示变化的文件。
  • Ctrl+U:只显示没有变化的文件(找出可能不需要的文件)。
  • Ctrl+L:切换层聚合模式。
  • q:退出 Dive。

四、分析镜像效率

Dive 界面底部会显示镜像效率评分:

  • Image Efficiency:镜像效率百分比,越高越好。
  • Potential Wasted Space:可能浪费的空间大小。

常见的空间浪费包括:

  • 在一层中安装包,在后面的层中删除(删除不会减小镜像大小)。
  • 包管理器缓存文件没有在同一层中清除。
  • 复制了不需要的源代码或开发工具。

五、CI/CD 集成

Dive 支持非交互模式,可以在 CI/CD 流水线中自动检查镜像质量:

# 使用 CI 模式分析镜像
CI=true dive myapp:latest

# 设置效率阈值(低于阈值则构建失败)
CI=true dive myapp:latest --highestUserWastedPercent 0.1 --highestWastedBytes 50MB --lowestEfficiency 0.95

配置文件 .dive-ci 可以放在项目根目录:

cat > .dive-ci <<'EOF'
rules:
  lowestEfficiency: 0.95
  highestWastedBytes: 50MB
  highestUserWastedPercent: 0.10
EOF

六、优化实践案例

使用 Dive 发现问题后,对照修改 Dockerfile:

# 优化前(Dive 显示 apt 缓存占用 100MB+)
FROM debian:bookworm-slim
RUN apt-get update
RUN apt-get install -y curl nginx
RUN apt-get clean

# 优化后(合并指令,同一层清除缓存)
FROM debian:bookworm-slim
RUN apt-get update && \
    apt-get install -y --no-install-recommends curl nginx && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*
# 优化前后对比
dive build -t myapp:before -f Dockerfile.before .
dive build -t myapp:after -f Dockerfile.after .
docker images | grep myapp

七、常见问题

Dive 无法连接 Docker

# 确认 Docker 正在运行
systemctl status docker

# 确认有权限访问 Docker Socket
ls -la /var/run/docker.sock

分析大镜像时内存不足

在搬瓦工小内存方案上分析大镜像可能内存不足,可以使用 --source docker-archive 模式减少内存占用:

docker save myimage:tag -o /tmp/image.tar
dive --source docker-archive /tmp/image.tar

总结

Dive 是优化 Docker 镜像的得力工具,它能直观地揭示镜像中每一层的内容和浪费的空间。建议在每次构建镜像后用 Dive 进行检查,结合 Dockerfile 最佳实践多阶段构建 持续优化。Dockerfile 的语法检查可以使用 Hadolint,安全漏洞扫描可以使用 Trivy。选购搬瓦工 VPS 请访问 bwh81.net,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。