10 poin oleh GN⁺ 2024-01-09 | 1 komentar | Bagikan ke WhatsApp
  • 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 dengan dive 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:latest diberikan sebagai contoh image target
  • Jika ingin menganalisis image segera setelah build, Anda dapat memakai perintah dive build dengan bentuk yang sama sebagai pengganti docker build
    • dive 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-ci di root repositori
    • lowestEfficiency: gagal jika efisiensi lebih rendah dari persentase yang ditentukan
    • highestWastedBytes: gagal jika ruang terbuang sama dengan atau melebihi kapasitas yang ditentukan
    • highestUserWastedPercent: 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 --source
    • dive <your-image> --source <source>
    • dive <source>://<your-image>
  • Opsi source yang didukung adalah sebagai berikut
    • docker: Docker engine, default
    • docker-archive: Docker Tar Archive di disk
    • podman: Podman engine, hanya didukung di Linux

Instalasi dan cara menjalankan

  • Ubuntu/Debian dapat diinstal melalui paket .deb atau 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.37 mungkin diperlukan
  • Jika memakai runtime alternatif seperti Colima, Anda mungkin perlu menentukan variabel lingkungan DOCKER_HOST untuk 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+C atau Q: keluar
    • Tab: beralih antara tampilan layer dan tampilan pohon file
    • Ctrl+F: filter file
    • Ctrl+A: di tampilan layer menampilkan perubahan image kumulatif, di tampilan pohon file men-toggle tampilan file yang ditambahkan
    • Ctrl+L: menampilkan perubahan layer saat ini
    • Ctrl+R, Ctrl+M, Ctrl+U: toggle tampilan file yang dihapus, dimodifikasi, dan tidak berubah
    • Ctrl+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 .yml juga dapat digunakan selain .yaml

1 komentar

 
GN⁺ 2024-01-09
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...

    • Rekomendasi yang bagus. Tidak seperti Docker, crane berjalan tanpa root dan tanpa daemon, jadi enak dipakai di Nix, dan di repositori Nix juga tersedia dengan nama crane
      Berkat itu, dengan Nix kita bisa mengelola bukan hanya dependensi build (misalnya Go) tetapi juga tool untuk packaging dan deployment (misalnya gnu tar, crane)
    • Saya penasaran apakah ada keuntungan performa kalau jumlah layer lebih sedikit. Walaupun image digabung, ukuran totalnya tetap sama, jadi sejauh pemahaman saya, penggabungan layer itu sendiri tidak memberi banyak manfaat
  • 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...

  • 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

    • Untuk Docker saya bisa menjawab. Prototipe pertamanya ditulis dengan Python, dan perusahaannya juga berpusat pada Python
      Alasan utama menulis ulang ke Go adalah untuk memanfaatkan popularitas Go yang sedang naik saat itu (2012). Saya ada di sana
    • Go adalah bahasa yang paling mudah untuk cross-compilation dan deployment, punya performa yang sangat baik dibanding produktivitasnya, concurrency bawaannya bagus, dan kemampuan networking di standard library-nya juga luar biasa
      Coba bayangkan kalau Docker dan Kubernetes ditulis dalam bahasa populer lain, perbedaannya akan terlihat
    • Saya melihat system tool, utility, command-line tool, dan software networking sebagai area tempat Go paling bersinar
      Sebagai alternatif modern yang matang, sepertinya hanya Rust yang benar-benar sebanding
    • Kubernetes ditulis dengan Go karena Google membuat Go, dan Google juga membuat Kubernetes
      Banyaknya engineer Go di tim internal juga karena alasan yang sama
    • Saat menjalankan container, kita biasanya ingin sesedikit mungkin memikirkan sistem dasarnya, dan Go memudahkan software untuk berjalan dalam dunianya sendiri yang kecil
      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 sesuai

    • Dengan sedikit trik, file itu bisa diakses lewat rsync, tapi tidak jauh berbeda dari memakai cat
  • Saat 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/

    • Lazydocker juga punya fitur yang mirip tapi lebih sederhana
      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 memang sedikit kurang terkait dengan utility container pada umumnya, tetapi saya sangat sering memakai GoogleContainerTools/container-structure-test
      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