Docker imajları ve katman içeriklerini inceleme aracı 'Dive'
(github.com/wagoodman)- Dive, Docker/OCI imajlarının katmanlarını ve dosya içeriklerini inceleyen, ayrıca imaj boyutunu küçültme fırsatlarını bulmaya yardımcı olan bir araçtır
- İmaj etiketi·ID·digest ile
dive <your-image-tag>çalıştırabilir veyadive build -t <some-tag>.ile build sonrası anında analiz işlemini tek seferde gerçekleştirebilirsiniz - Bir katman seçildiğinde, o katman ile önceki katmanların birleşiminden oluşan dosya ağacı gösterilir; eklenen·değiştirilen·silinen dosyaları ve kümülatif değişiklikleri dosya ağacı içinde görebilirsiniz
- Deneysel image efficiency göstergesi, yinelenen dosyalar, katmanlar arası dosya taşıma ve tamamen kaldırılmamış dosyalardan kaynaklanan boşa harcanan alanı puan ve toplam boyut olarak tahmin eder
CI=trueile UI atlanabilir ve imaj verimliliği·boşa harcanan alan eşiklerine göre başarı/başarısızlık sonucu döndürülebilir; böylece CI pipeline'larında imaj boyutu yönetimi otomatikleştirilebilir
Dive ne yapar?
- Dive, Docker imajlarını, katman içeriklerini ve Docker/OCI imaj boyutunu küçültmenin yollarını inceleyen bir araçtır
- Temel kullanım, imaj etiketi·ID·digest vermektir
dive <your-image-tag>
- Docker container olarak da çalıştırılabilir; bu durumda Docker socket'inin mount edilmesi gerekir
docker.io/wagoodman/diveimajı kullanılır- Örnek hedef imaj olarak
nginx:latestverilmiştir
- Bir imajı build ettikten hemen sonra analiz etmek için
docker buildyerine aynı biçimdedive buildkomutu kullanılabilirdive build -t <some-tag> .
- macOS'ta build analizini container olarak çalıştırma yöntemi yalnızca Docker container engine'i destekler
- Proje durumu beta quality düzeyindedir; yeni özellik istekleri veya hatalar issue olarak bildirilebilir
Katmanları ve dosya değişikliklerini inceleme
- Soldan bir katman seçildiğinde, sağda o katman ile önceki katmanların birleşiminden oluşan dosya ağacı gösterilir
- Yön tuşlarıyla dosya ağacı içinde gezilebilir
- Her katmandaki değişen dosya durumları dosya ağacında gösterilir
- değişti
- düzenlendi
- eklendi
- kaldırıldı
- Değişiklik gösterimi, belirli bir katman temelinde veya o katmana kadar olan kümülatif değişiklikler temelinde ayarlanabilir
İmaj verimliliği ve boşa harcanan alan tahmini
- Sol alt panel, temel katman bilgilerini ve deneysel image efficiency göstergesini gösterir
- Bu gösterge, imaj içindeki boşa harcanan alanı tahmin eder
- katmanlar arasında dosya yinelenmesi
- katmanlar arasında dosya taşınması
- tamamen kaldırılmamış dosyalar
- Sonuç, yüzde score ve toplam boşa harcanan dosya alanı olarak sunulur
CI'da başarı/başarısızlık kriteri olarak kullanım
CI=trueortam değişkeniyle çalıştırıldığında Dive UI atlanır, imaj analiz edilir ve dönüş kodu olarak pass/fail sonucu verilir- Depo kökündeki
.dive-cidosyasıyla 3 kriter ayarlanabilirlowestEfficiency: verimlilik belirtilen oranın altındaysa başarısızhighestWastedBytes: boşa harcanan alan belirtilen boyuta eşit ya da daha fazlaysa başarısızhighestUserWastedPercent: kullanıcı katmanlarına göre boşa harcanan oran belirtilen orana eşit ya da daha fazlaysa başarısız
highestUserWastedPercenthesabında base image layer, toplam imaj boyutuna dahil edilmez- CI yapılandırma dosyası yolu
--ci-configseçeneğiyle geçersiz kılınabilir
İmaj kaynağı ve container engine
--sourceseçeneğiyle container imajının nereden alınacağı seçilebilirdive <your-image> --source <source>dive <source>://<your-image>
- Desteklenen
sourceseçenekleri şunlardırdocker: Docker engine, varsayılandocker-archive: disk üzerindeki Docker Tar Archivepodman: Podman engine, yalnızca Linux desteklenir
Kurulum ve çalıştırma yöntemleri
- Ubuntu/Debian sistemlerinde
.debpaketi veya Snap ile kurulabilir - Snap yöntemi, Docker
apt-getile kurulduysa önerilmez; mevcut Docker daemon'unu bozabileceğine dair uyarı vardır - RHEL/Centos sistemlerinde
.rpmpaketiyle kurulabilir - Arch Linux'ta extra repository üzerinden sunulur ve pacman ile kurulabilir
- macOS'ta Homebrew, MacPorts veya releases page üzerindeki Darwin build'i ile kurulabilir
- Windows'ta Chocolatey, scoop,
wingetveya releases page üzerindeki Windows build'i ile kurulabilir - Go aracıyla kurulum için Go 1.10 veya üzeri gerekir
go install github.com/wagoodman/dive@latest- Bu yöntemle kurulduğunda
dive -vçalıştırıldığında doğru sürüm gösterilmez
- Nix/NixOS ve x-cmd kurulum yöntemleri de sunulmaktadır
- Docker imajı olarak çalıştırırken Docker socket dosyasının eklenmesi gerekir
-v /var/run/docker.sock:/var/run/docker.sock
- Yerel Docker sürümüne bağlı olarak
DOCKER_API_VERSION=1.37gibi ortam değişkenleri gerekebilir - Colima gibi alternatif runtime'lar kullanılıyorsa, yerel imajları almak için
DOCKER_HOSTortam değişkeninin belirtilmesi gerekebilir
Kullanım ve UI ayarları
- Başlıca tuş kısayolları, katman görünümü ile dosya ağacı görünümü arasında geçiş yaparak gezinme·filtreleme·gösterim geçişleri sağlar
Ctrl+CveyaQ: çıkışTab: katman görünümü ile dosya ağacı görünümü arasında geçişCtrl+F: dosya filtresiCtrl+A: katman görünümünde kümülatif imaj değişikliklerini gösterme, dosya ağacı görünümünde eklenen dosyaları gösterme geçişiCtrl+L: mevcut katman değişikliklerini göstermeCtrl+R,Ctrl+M,Ctrl+U: kaldırılan·düzenlenen·değişmeyen dosyaları gösterme geçişiCtrl+B: dosya özelliklerini gösterme geçişi
- Ayrı bir yapılandırma zorunlu değildir, ancak YAML yapılandırma dosyasıyla değerler geçersiz kılınabilir
- Yapılandırılabilen öğeler arasında container engine, imaj arşivi ayrıştırma hatalarını yok sayma, log, tuş atamaları, diff gösterimi, dosya ağacı genişliği, dizinlerin varsayılan kapalı durumu ve katman kümülatif değişiklik gösterimi yer alır
- Yapılandırma dosyası arama konumları şunlardır
$XDG_CONFIG_HOME/dive/*.yaml$XDG_CONFIG_DIRS/dive/*.yaml~/.config/dive/*.yaml~/.dive.yaml
.yamlyerine.ymluzantısı da kullanılabilir
1 yorum
Hacker News yorumları
İmajlar ve katmanlarla çalışırken crane harika; temel kütüphanesi go-containerregistry de iyi.
Mevcut bir imaja yeni katman ekleyebilir veya metadata’yı (env vars, labels, entrypoint vb.) değiştirebilir; çok katmanlı imajları tek katmana “düzleştirebilir” de.
Ayrıca değişiklikleri yeni bir base image üzerine yeniden uygulayan “rebase” işlemini de yapabiliyor; tüm bu işlemleri doğrudan registry üzerinde gerçekleştirdiği için Docker gerekmiyor.
https://github.com/google/go-containerregistry/blob/main/cmd...
craneadıyla sunuluyor.Böylece Nix ile yalnızca build bağımlılıklarını (ör. Go) değil, paketleme ve dağıtım araçlarını da (ör. gnu tar, crane) birlikte yönetebiliyorsunuz.
dive, Docker imajlarının nasıl çalıştığını ve verimli bir Dockerfile’ın nasıl yazılacağını anlamamda gerçekten faydalı oldu.
Dokümantasyon okumak önemli ama Dockerfile’ı değiştirdikten sonra ortaya çıkan katman yapısının nasıl değiştiğini doğrudan görmek, anlamam açısından belirleyiciydi.
Dive harika. Bu tür araçlar, tam olarak neyi build edip dağıttığımı öğrenmek ve bundan emin olmak için önemli.
Dredge de bakmaya değer bir araç; katman farklarını karşılaştırırken kullanıyorum.
https://github.com/mthalman/dredge/blob/main/docs/commands/i...
https://blog.haschek.at/2019/the-curious-case-of-the-RasPi-i...
Aptalca bir soru olabilir ama çoğu container ve altyapı aracının neden Go ile yazıldığını merak ediyorum.
Aklıma Docker, Podman, nerdctl, Terraform, Kubernetes geliyor; bu tür araçları yaparken Go’nun sunduğu belirgin bir avantaj olup olmadığını bilmek isterim.
Go ile yeniden yazılmasının ana nedeni, o dönemde (2012) yükselen Go popülerliğinin rüzgârından yararlanmaktı. Oradaydım.
Docker ve Kubernetes’in başka popüler dillerle yazıldığını hayal edince fark ortaya çıkıyor.
Olgun ve modern alternatif olarak yalnızca Rust var gibi görünüyor.
İç ekiplerde çok sayıda Go mühendisi olmasının nedeni de aynı.
Üstelik ekosistem etkisi de var: başka implementasyonların paketlerini kodunuzun bazı bölümlerinde doğrudan kullanabiliyorsunuz.
Dive’ı seviyorum ve ayda birkaç kez araç kutumdan çıkarıp kullanıyorum.
Ancak seçilen dosyanın içeriğini doğrudan görmenin bir yolu olup olmadığını merak ediyorum. Bir katmanın içinde bir dosyanın varlığını doğruladıktan sonra çoğu zaman içeriğine bakmak istiyorum; şu an genellikle container’ı çalıştırıp
catkullanıyor ya da içeriği çıkarıp klasörün içine gidiyorum.catkullanmaktan çok da farklı değil.Birçok public Docker container’ını genişletirken, içeride ne yaptıklarını kurcalama sürecinde Dive birkaç kez hayatımı kurtardı.
Gerçekten A+ seviyesinde bir yazılım.
dive gibi harika terminal TUI araçları daha var. Aklıma lazydocker ve dry geliyor.
Docker kategorisinde de birkaç tane var.
[0] https://terminaltrove.com/
Kontrol ettim: katmanları görebiliyor ama yalnızca her katmanın komutunu gösteriyor.
Dive, container/Docker alanında muazzam bir araç. Container’ın içinde gerçekten ne olduğunu debug etmeyi çok daha kolaylaştırıyor.
Depot [0]’ı ilk başlattığımızda, imaj boyutunu nasıl küçültebileceğimiz ve build’leri nasıl hızlandırabileceğimiz sıkça soruluyordu; ben de Dive ile bu sorunu nasıl çözeceğimizi kısa bir yazıda [1] özetledim. Şimdi biraz eskimiş olabilir ama birilerine faydalı olabilir.
Dive’dan ilham alarak her build’de build context içinde gerçekte ne olduğunu daha kolay görünür hale getirdik ve birkaç hafta önce bunu Depot özelliği olarak yayınladık.
[0] https://depot.dev
[1] https://depot.dev/blog/reducing-image-size-with-dive
[2] https://depot.dev/blog/build-context
Dive’ın çok faydalı olmasının dışında, yeterince takdir edilmeyen bir avantajı daha var: yazarı harika bir geliştirici ve birlikte çalışması gerçekten keyifli biri.
Google’ın container-diff adlı aracı da gerçekten kullanışlı.
Bash’e pipe edilerek çalıştırılması önerilen rastgele bir script’in sistemde ne yapacağını kontrol etmek için kullanıyorum.
Container uygulamaları veya imajları üzerinde entegrasyon testleri çalıştırmak için pratik bir yol.
Bu Google açık kaynak projelerinde, onları başlangıçta sürdüren kişilerin çoğu ayrıldığı için ilgiye ihtiyaç var gibi; bu üzücü. Mümkün olduğunda PR göndermeye ve ara sıra issue kapatmaya çalışıyorum. Özellikle bu test aracı, içeride sürdürmemiz gereken çok sayıda base image ile uğraşırken akıl sağlığımı korumak için çok değerli.