Alat eksplorasi image Docker dan isi layer, 'Dive'
(github.com/wagoodman)- Dive adalah alat untuk menjelajahi layer dan isi file image Docker/OCI, serta menemukan peluang untuk mengurangi ukuran image
- Anda dapat menjalankan
dive <your-image-tag>dengan tag, ID, atau digest image, atau melakukan analisis langsung setelah build sekaligus dengandive build -t <some-tag>. - Saat memilih layer, alat ini menampilkan pohon file gabungan dari layer tersebut dan layer sebelumnya, sehingga file yang ditambahkan, diubah, dihapus, serta perubahan kumulatif dapat diperiksa di pohon file
- Metrik eksperimental image efficiency memperkirakan ruang terbuang yang berasal dari file duplikat, pemindahan file antar-layer, dan file yang tidak dihapus sepenuhnya, dalam bentuk skor dan total kapasitas
- Dengan
CI=true, UI dapat dilewati dan hasil lulus/gagal dikembalikan berdasarkan efisiensi image dan ambang ruang terbuang, sehingga pengelolaan ukuran image di pipeline CI dapat diotomatisasi
Apa yang dilakukan Dive
- Dive adalah alat untuk menjelajahi image Docker, isi layer, dan cara mengurangi ukuran image Docker/OCI
- Cara menjalankan dasar adalah dengan memberikan tag, ID, atau digest image
dive <your-image-tag>
- Alat ini juga dapat dijalankan sebagai kontainer Docker, dan dalam hal ini socket Docker harus di-mount
- menggunakan image
docker.io/wagoodman/dive nginx:latestdiberikan sebagai contoh image target
- menggunakan image
- Jika ingin menganalisis image segera setelah build, Anda dapat memakai perintah
dive builddengan bentuk yang sama sebagai penggantidocker builddive build -t <some-tag> .
- Di macOS, metode analisis build yang dijalankan sebagai kontainer hanya mendukung Docker container engine
- Status proyek adalah beta quality, dan permintaan fitur baru atau bug dapat diajukan sebagai issue
Menjelajahi layer dan perubahan file
- Jika layer dipilih di sebelah kiri, pohon file gabungan dari layer tersebut dan layer sebelumnya ditampilkan di sebelah kanan
- Pohon file dapat dijelajahi dengan tombol panah
- Status file yang berubah pada setiap layer ditampilkan di pohon file
- berubah
- dimodifikasi
- ditambahkan
- dihapus
- Cara penandaan perubahan dapat disesuaikan berdasarkan layer tertentu atau berdasarkan perubahan kumulatif hingga layer tersebut
Efisiensi image dan perkiraan ruang terbuang
- Panel kiri bawah menampilkan informasi layer dasar dan metrik eksperimental image efficiency
- Metrik ini memperkirakan ruang terbuang di dalam image
- duplikasi file antar-layer
- pemindahan file antar-layer
- file yang tidak dihapus sepenuhnya
- Hasil diberikan sebagai score persentase dan total ruang file yang terbuang
Digunakan sebagai kriteria lulus/gagal di CI
- Jika dijalankan dengan variabel lingkungan
CI=true, Dive melewati UI, menganalisis image, lalu memberikan hasil pass/fail melalui return code - Tiga kriteria dapat diatur melalui file
.dive-cidi root repositorilowestEfficiency: gagal jika efisiensi lebih rendah dari persentase yang ditentukanhighestWastedBytes: gagal jika ruang terbuang sama dengan atau melebihi kapasitas yang ditentukanhighestUserWastedPercent: gagal jika persentase ruang terbuang berdasarkan layer pengguna sama dengan atau melebihi persentase yang ditentukan
- Dalam perhitungan
highestUserWastedPercent, base image layer tidak dimasukkan ke ukuran total image - Path file konfigurasi CI dapat ditimpa dengan opsi
--ci-config
Sumber image dan container engine
- Anda dapat memilih lokasi pengambilan image kontainer dengan opsi
--sourcedive <your-image> --source <source>dive <source>://<your-image>
- Opsi
sourceyang didukung adalah sebagai berikutdocker: Docker engine, defaultdocker-archive: Docker Tar Archive di diskpodman: Podman engine, hanya didukung di Linux
Instalasi dan cara menjalankan
- Ubuntu/Debian dapat diinstal melalui paket
.debatau Snap - Metode Snap tidak direkomendasikan jika Docker dipasang dengan
apt-get, karena dapat merusak daemon Docker yang sudah ada - RHEL/Centos dapat diinstal melalui paket
.rpm - Arch Linux tersedia di extra repository dan dapat diinstal dengan pacman
- macOS dapat diinstal melalui Homebrew, MacPorts, atau build Darwin dari releases page
- Windows dapat diinstal melalui Chocolatey, scoop,
winget, atau build Windows dari releases page - Untuk instalasi dengan alat Go, dibutuhkan Go 1.10 atau lebih baru
go install github.com/wagoodman/dive@latest- Jika dipasang dengan cara ini, versi yang benar tidak akan ditampilkan saat menjalankan
dive -v
- Metode instalasi Nix/NixOS dan x-cmd juga disediakan
- Saat dijalankan sebagai image Docker, file socket Docker harus disertakan
-v /var/run/docker.sock:/var/run/docker.sock
- Bergantung pada versi Docker lokal, variabel lingkungan seperti
DOCKER_API_VERSION=1.37mungkin diperlukan - Jika memakai runtime alternatif seperti Colima, Anda mungkin perlu menentukan variabel lingkungan
DOCKER_HOSTuntuk mengambil image lokal
Operasi dan pengaturan UI
- Key binding utama memungkinkan navigasi, pemfilteran, dan toggle tampilan saat berpindah antara tampilan layer dan tampilan pohon file
Ctrl+CatauQ: keluarTab: beralih antara tampilan layer dan tampilan pohon fileCtrl+F: filter fileCtrl+A: di tampilan layer menampilkan perubahan image kumulatif, di tampilan pohon file men-toggle tampilan file yang ditambahkanCtrl+L: menampilkan perubahan layer saat iniCtrl+R,Ctrl+M,Ctrl+U: toggle tampilan file yang dihapus, dimodifikasi, dan tidak berubahCtrl+B: toggle tampilan atribut file
- Tidak memerlukan konfigurasi terpisah, tetapi nilainya dapat ditimpa dengan file konfigurasi YAML
- Item yang dapat dikonfigurasi mencakup container engine, apakah error parsing arsip image diabaikan, log, key binding, tampilan diff, lebar pohon file, status lipatan default direktori, dan tampilan perubahan layer kumulatif
- Lokasi pencarian file konfigurasi adalah sebagai berikut
$XDG_CONFIG_HOME/dive/*.yaml$XDG_CONFIG_DIRS/dive/*.yaml~/.config/dive/*.yaml~/.dive.yaml
- Ekstensi
.ymljuga dapat digunakan selain.yaml
1 komentar
Komentar Hacker News
Saat menangani image dan layer, crane sangat bagus, dan library dasarnya, go-containerregistry, juga bagus
Bisa menambahkan layer baru ke image yang sudah ada atau mengubah metadata (env vars, labels, entrypoint, dll.), dan juga bisa “meratakan” image multilayer menjadi satu layer
Selain itu, ada juga fitur “rebase” untuk menerapkan kembali perubahan ke base image yang baru, dan semua ini diproses langsung di registry sehingga tidak perlu Docker
https://github.com/google/go-containerregistry/blob/main/cmd...
craneBerkat itu, dengan Nix kita bisa mengelola bukan hanya dependensi build (misalnya Go) tetapi juga tool untuk packaging dan deployment (misalnya gnu tar, crane)
dive sangat membantu untuk memahami bagaimana image Docker bekerja dan bagaimana menulis Dockerfile yang efisien
Membaca dokumentasi itu penting, tetapi melihat langsung bagaimana struktur layer hasilnya berubah setelah mengubah Dockerfile sangat menentukan untuk benar-benar memahaminya
Dive luar biasa. Alat seperti ini penting untuk belajar dan yakin tentang apa sebenarnya yang saya build dan deploy
Dredge juga layak dilihat, dan saya memakainya saat membandingkan perbedaan antar layer
https://github.com/mthalman/dredge/blob/main/docs/commands/i...
https://blog.haschek.at/2019/the-curious-case-of-the-RasPi-i...
Mungkin ini pertanyaan bodoh, tapi saya penasaran kenapa sebagian besar tool container dan infrastruktur ditulis dengan Go
Yang terlintas misalnya Docker, Podman, nerdctl, Terraform, Kubernetes, dan saya ingin tahu apakah Go memang punya keunggulan yang jelas untuk membuat tool seperti ini
Alasan utama menulis ulang ke Go adalah untuk memanfaatkan popularitas Go yang sedang naik saat itu (2012). Saya ada di sana
Coba bayangkan kalau Docker dan Kubernetes ditulis dalam bahasa populer lain, perbedaannya akan terlihat
Sebagai alternatif modern yang matang, sepertinya hanya Rust yang benar-benar sebanding
Banyaknya engineer Go di tim internal juga karena alasan yang sama
Selain itu ada efek ekosistem juga, sehingga paket dari implementasi lain bisa langsung dimanfaatkan di sebagian kode
Saya suka Dive dan memakainya beberapa kali dalam sebulan dari kotak alat saya
Tapi saya penasaran apakah ada cara untuk langsung melihat isi file yang dipilih. Sering kali saya ingin memastikan file itu memang ada di dalam layer lalu melihat isinya, tetapi sekarang biasanya saya menjalankan container lalu memakai
cat, atau mengekstrak isinya lalu masuk ke folder yang sesuaicatSaat memperluas beberapa container Docker publik, Dive sudah berkali-kali menyelamatkan saya saat membongkar apa yang sebenarnya terjadi di dalamnya
Ini benar-benar software kelas A+
Ada lebih banyak alat TUI terminal hebat seperti dive. Yang terpikir oleh saya adalah lazydocker dan dry
Di kategori Docker juga ada beberapa
[0] https://terminaltrove.com/
Setelah dicek, ia bisa menampilkan layer, tetapi hanya menunjukkan perintah untuk tiap layer
Dive adalah alat yang luar biasa di ranah container/Docker. Ini membuat debugging tentang apa saja yang benar-benar ada di dalam container jadi jauh lebih mudah
Saat pertama kali memulai Depot [0], saya sering ditanya bagaimana cara mengurangi ukuran image dan mempercepat build, jadi saya menulis artikel singkat [1] tentang cara menyelesaikan masalah itu dengan Dive. Mungkin sekarang sudah agak usang, tetapi bisa jadi masih membantu seseorang
Terinspirasi oleh Dive, kami juga membuat agar isi build context yang sebenarnya pada setiap build bisa terlihat lebih mudah, dan beberapa minggu lalu merilisnya sebagai fitur Depot
[0] https://depot.dev
[1] https://depot.dev/blog/reducing-image-size-with-dive
[2] https://depot.dev/blog/build-context
Selain sangat berguna, Dive punya kelebihan lain yang kurang dihargai. Penulisnya adalah developer yang hebat dan orang yang sangat menyenangkan untuk diajak bekerja sama
Ada juga alat Google bernama container-diff yang sangat berguna
Saya memakainya untuk memeriksa apa yang akan dilakukan skrip acak yang direkomendasikan untuk dijalankan dengan di-pipe ke bash terhadap sistem saya
Ini cara yang praktis untuk menjalankan integration test pada aplikasi atau image container
Sayangnya terasa seperti banyak proyek open source Google semacam ini membutuhkan perhatian karena banyak maintainer aslinya sudah pergi. Saya berusaha mengirim PR bila sempat dan kadang juga menutup issue. Khusus tool pengujian ini, nilainya sangat besar untuk menjaga kewarasan saat harus menangani banyak base image yang perlu dipelihara secara internal