TopGit
Đánh giá repo GitHub

dive: khám phá layer ảnh Docker

DTopGit review image for wagoodman/dive
Review by Topgit.dev for wagoodman/dive, with GitHub repository stats and README context.
Nhận định nhanh

dive là công cụ chạy trong terminal để soi từng layer trong ảnh Docker và tìm chỗ lãng phí dung lượng trước khi bạn ship image. Nên dùng khi bạn muốn biết vì sao một Dockerfile tạo ra ảnh quá nặng, hoặc cần một bước kiểm tra kích thước tự động trong CI. Bỏ qua nếu chỉ thỉnh thoảng cần một con số dung lượng, vì `docker history` đã cho bạn điều đó mà không cần cài thêm gì.

Sao
★ 54.6k
Fork
⑂ 2.0k
Ngôn ngữ
Go
Giấy phép
MIT
Chủ đề
Developer Tools
Cập nhật
Dec 2025
Trang chủ
—
GitHub

dive làm gì và vì sao layer ảnh lại quan trọng

dive là một terminal UI (TUI) giúp bạn mở một ảnh Docker hoặc OCI rồi xem qua từng layer, cho biết chính xác layer nào đã thêm, sửa, hoặc xoá file gì. Layer quan trọng vì một Dockerfile copy file sai thứ tự, hoặc dọn dẹp ở một RUN sau thay vì ngay trong RUN đó, có thể khiến hàng gigabyte bị lặp lại giữa các layer mà không bao giờ thực sự biến mất khỏi ảnh cuối cùng.

Khám phá layer, file và hiệu quả ảnh

  • ✓Duyệt filetree theo từng layer: chọn một layer bên trái, xem nội dung gộp với mọi layer trước đó bên phải, di chuyển bằng phím mũi tên.
  • ✓Theo dõi thay đổi theo layer: file được thêm, sửa, hoặc xoá đều được đánh dấu trong cây file, xem riêng cho layer đang chọn hoặc gộp tới thời điểm đó.
  • ✓Điểm hiệu quả ảnh: một điểm phần trăm mang tính thử nghiệm cộng với tổng số byte lãng phí, ước tính dung lượng mất đi do file bị lặp hoặc còn sót lại qua các layer.
  • ✓`dive build -t <tag> .` thay cho `docker build` và đưa bạn thẳng vào phân tích ảnh vừa build xong.
  • ✓Chế độ CI (`CI=true dive <image>`) bỏ qua giao diện UI, trả về mã thoát pass/fail dựa trên rule trong file `.dive-ci`.
  • ✓Nhiều nguồn ảnh qua `--source`: Docker engine, một Docker tar archive trên đĩa, hoặc Podman.
  • ✓Keybinding và file cấu hình tuỳ chỉnh được: độ rộng pane filetree, trạng thái collapse mặc định, hiển thị thuộc tính file.
Số sao GitHub của repo này thay đổi thế nào theo thời gian. Nguồn: star-history.com.Xem lịch sử sao ↗

Cài đặt dive trên Linux, macOS và Windows

Trên Debian và Ubuntu, script cài đặt trong README lấy tag release mới nhất từ GitHub API rồi cài file `.deb` tương ứng bằng `apt install`; RHEL và CentOS làm tương tự với file `.rpm`. Cũng có gói snap, nhưng README cảnh báo không nên dùng cách này nếu Docker của bạn được cài qua `apt-get`, vì có thể làm hỏng Docker daemon đang chạy (xem issue #546). Arch Linux có dive trong kho extra chính thức, cài bằng `pacman -S dive`. Trên macOS, `brew install dive` hoặc `sudo port install dive` (MacPorts) đều dùng được, hoặc bạn tải bản Darwin từ trang releases. Trên Windows, Chocolatey (`choco install dive`), Scoop (`scoop install main/dive`), và winget (`winget install --id wagoodman.dive`) đều được hỗ trợ, cùng với tải trực tiếp. Với Go, chạy `go install github.com/wagoodman/dive@latest` (cần Go 1.10 trở lên), nhưng README lưu ý cách này không nhúng version nên `dive -v` sẽ không hiển thị đúng. Nix, NixOS, x-cmd, và image Docker (`docker pull docker.io/wagoodman/dive` hoặc `ghcr.io/wagoodman/dive`) là các lựa chọn còn lại.

Phân tích ảnh Docker đầu tiên với dive

Chạy `dive <your-image-tag>` với bất kỳ image nào đã pull hoặc build sẵn — `dive nginx:latest` sẽ mở TUI ngay. Nếu đang build mới, `dive build -t <some-tag> .` thay cho lệnh `docker build` thông thường và đưa bạn vào phân tích ngay khi build xong. Trong giao diện, Tab chuyển giữa danh sách layer và cây file, Ctrl+F lọc file, phím mũi tên (hoặc j/k kiểu vim) để di chuyển. Khi chạy dive qua container Docker, bạn cần mount Docker socket (`-v /var/run/docker.sock:/var/run/docker.sock`); nếu version API Docker local không khớp, đặt biến `DOCKER_API_VERSION`, còn nếu dùng runtime khác như Colima thì export `DOCKER_HOST` trước để dive tìm được image local. Muốn kiểm tra kiểu script thay vì mở UI, đặt `CI=true` trước lệnh.

Tìm dung lượng lãng phí và giảm kích thước ảnh

  • •Debug Dockerfile nhiều stage: tìm đúng bước RUN hay COPY nào thực sự làm ảnh phình to, thay vì đoán mò từ `docker history`.
  • •Chặn kích thước trước khi merge: gắn `CI=true dive` cùng file `.dive-ci` vào CI/CD pipeline để build fail khi dung lượng lãng phí hoặc điểm hiệu quả vượt ngưỡng bạn đặt.
  • •So sánh base image: xem phần phình to đến từ layer của base image hay từ layer ứng dụng của bạn nhiều hơn.
  • •Dọn dẹp Dockerfile cũ không ai muốn đụng vào, để tìm file đã copy vào nhưng chưa từng bị xoá ở layer sau.

Điểm mạnh

  • ✓Cây file theo từng layer hữu ích hơn nhiều so với đọc output của `docker history` khi bạn cần biết chính xác layer nào đụng vào file nào.
  • ✓`dive build -t <tag> .` gộp "build rồi soi" thành một lệnh thay vì hai.
  • ✓Chế độ CI biến việc ảnh bị phình to thành một check pass/fail chạy script được, thay vì phải tự nhìn bằng mắt.
  • ✓Hỗ trợ cả Podman và Docker tar archive qua `--source`, không chỉ Docker daemon đang chạy.
  • ✓Keybinding và các pane UI cấu hình được qua file YAML thay vì bị hard-code cứng.

Giới hạn hiện tại và lưu ý bản beta

  • △README tự gọi dive là "beta quality" — đây là tín hiệu từ chính maintainer, không phải câu rào trước cho vui.
  • △Điểm hiệu quả ảnh được mô tả rõ là thử nghiệm (experimental).
  • △Cài qua snap bị README cảnh báo là rủi ro nếu Docker được cài qua `apt-get`, vì có thể làm hỏng Docker daemon hiện có (xem issue #546 trong README).
  • △Build bằng `go install` bỏ qua bước nhúng version, nên `dive -v` sẽ không hiển thị đúng số version.
  • △Chạy với Docker engine cần mount Docker socket, điều mà một số CI runner hoặc môi trường khoá chặt sẽ không cho phép.

Các cách khác để soi layer ảnh Docker

`docker history <image>` — có sẵn trong Docker CLI, cho biết dung lượng và lệnh của từng layer nhưng không có cây file để duyệt hay ước tính dung lượng lãng phí.container-diff (Google) — so sánh hai image với nhau theo từng layer, hữu ích khi view một image của dive là chưa đủ.slim-toolkit (trước đây là DockerSlim) — thay vì chỉ chỉ ra chỗ lãng phí, công cụ này còn tự động thu nhỏ image lại.Docker Scout — công cụ phân tích image riêng của Docker, gắn với tài khoản Docker Desktop/Hub thay vì một binary độc lập.

Câu hỏi thường gặp về dive

dive có miễn phí và mã nguồn mở không?

dive miễn phí và mã nguồn mở, phát hành theo giấy phép MIT, mã nguồn được host trên GitHub.

dive có hoạt động với podman cũng như docker không?

dive hỗ trợ Podman như một nguồn ảnh bên cạnh Docker: dùng `--source podman` (chỉ trên Linux, theo README) thay vì nguồn Docker engine mặc định.

làm sao để chạy dive ở chế độ CI để kiểm tra pass fail?

dive chạy ở chế độ CI khi bạn đặt `CI=true` trước lệnh, ví dụ `CI=true dive <your-image>`. Nó bỏ qua giao diện UI và trả về mã thoát pass/fail dựa trên rule trong file `.dive-ci` (hoặc đường dẫn đặt qua `--ci-config`).

điểm hiệu quả ảnh (image efficiency score) trong dive nghĩa là gì?

Điểm hiệu quả ảnh của dive là một ước tính phần trăm mang tính thử nghiệm về lượng dung lượng bị lãng phí — do file bị lặp, bị di chuyển giữa các layer, hoặc chưa được xoá hết — hiển thị cùng tổng số byte lãng phí.

có thể tuỳ chỉnh keybinding và cài đặt UI của dive không?

Keybinding và UI của dive (độ rộng pane, trạng thái collapse mặc định, hiển thị thuộc tính file) cấu hình được qua file YAML mà dive tìm ở các vị trí như `~/.dive.yaml` hoặc `~/.config/dive/`.

vì sao dive cần Docker socket để phân tích image?

dive cần mount Docker socket (`/var/run/docker.sock`) vì nó gọi API của Docker engine để lấy dữ liệu layer khi dùng nguồn Docker mặc định — đó là lý do các lệnh cài đặt qua Docker đều mount socket này.

Vấn đề mà dive giải quyết

Dockerfile phình to dần qua từng lần chỉnh sửa — một apt cache chưa từng được xoá, một build artifact copy vào trước khi RUN sau đó xoá đi, một base image đổi mà không kiểm tra lại đã đổi những gì — và không cái nào trong số đó hiện ra ở con số dung lượng ảnh đơn thuần. `docker history` liệt kê dung lượng từng layer nhưng không cho biết file nào nằm trong đó, nên việc lần ra dung lượng đã đi đâu thường phải đoán hoặc build đi build lại để thử. dive mở image ra và cho thấy đúng cây file của từng layer, nên chính khoản lãng phí này hiện rõ chỉ trong một lần xem.

Nên dùng dive khi nào — và khi nào nên bỏ qua

Nên thử dive nếu bạn đang giữ một Dockerfile đã phình to qua nhiều lần chỉnh sửa và muốn biết chính xác dung lượng đang nằm ở đâu trước khi tối ưu container theo kiểu mò mẫm, hoặc muốn có một bước chặn kích thước tự động trong CI thay vì để người tự nhìn `docker images`. Bỏ qua nếu bạn chỉ thỉnh thoảng cần một con số dung lượng — `docker history` hay `docker images` đã trả lời được điều đó mà không cần cài thêm binary nào, hoặc nếu môi trường của bạn không thể mount Docker socket.

Repo liên quan

Nguồn & ghi công

Dựa trên repository GitHub wagoodman/dive (github.com/wagoodman/dive) — README, releases và metadata của repo.

Dữ liệu GitHub · đồng bộ lần cuối 14 thg 8, 2026Đánh giá bởi Henry
← Về TopGit

Muốn nghe thêm một ý kiến về dive?

Hỏi một AI đọc được trang này — một cú bấm là có ngay nhận định về dive.

GitHub