Mümkün olduğunda, her zaman aynı dosyaları tek bir RUN
satırda silen komutlara sahip dosyalar oluşturan komutları birleştiririm . Bunun nedeni, her RUN
satırın görüntüye bir katman eklemesidir, çıktının tam anlamıyla görüntüleyebileceğiniz dosya sistemi değişiklikleridir.docker diff
oluşturduğu geçici kapsayıcıda . Farklı bir katmanda oluşturulmuş bir dosyayı silerseniz, tüm birleşim dosya sistemi, dosya sistemi değişikliğini yeni bir katmanda kaydetmektir, dosya hala önceki katmanda bulunur ve ağ üzerinden gönderilir ve diskte depolanır. Dolayısıyla, kaynak kodunu indirirseniz, çıkartırsanız, bir ikili dosyada derlerseniz ve ardından tgz ve kaynak dosyalarını silerseniz, tüm bunların görüntü boyutunu küçültmek için gerçekten tek bir katmanda yapılmasını istersiniz.
Daha sonra, diğer görüntülerde yeniden kullanım potansiyeline ve beklenen önbelleğe alma kullanımına göre kişisel olarak katmanları ayırıyorum. Tümü aynı temel görüntüye sahip 4 görüntüm varsa (örn. Debian), ilk çalıştırma komutuna bu görüntülerin çoğuna ortak yardımcı programların bir koleksiyonunu çekebilirim, böylece diğer görüntüler önbelleğe alma işleminden yararlanır.
Dockerfile'da sipariş, görüntü önbelleğinin yeniden kullanımına bakıldığında önemlidir. Çok nadiren güncellenecek bileşenlere bakıyorum, muhtemelen yalnızca temel görüntü güncellendiğinde ve bunları Dockerfile'da üst sıralara yerleştirdiğinde. Dockerfile'ın sonuna doğru, hızlı çalışacak ve sık sık değişebilecek tüm komutları ekliyorum, örneğin, ana bilgisayara özel UID'ye sahip bir kullanıcı eklemek veya klasörler oluşturmak ve izinleri değiştirmek gibi. Kap aktif olarak geliştirilmekte olan yorumlanmış kod (örneğin JavaScript) içeriyorsa, bu mümkün olduğunca geç eklenir, böylece bir yeniden oluşturma yalnızca o tek değişikliği çalıştırır.
Bu değişiklik gruplarının her birinde, katmanları en aza indirmek için elimden geldiğince pekiştiriyorum. Yani 4 farklı kaynak kodu klasörü varsa, bunlar tek bir klasöre yerleştirilir, böylece tek bir komutla eklenebilir. Apt-get gibi bir şeyden yapılan tüm paket kurulumları, paket yöneticisi ek yükünü (güncelleme ve temizleme) en aza indirmek için mümkün olduğunda tek bir ÇALIŞTIRMA olarak birleştirilir.
Çok aşamalı derlemeler için güncelleme:
Çok aşamalı bir yapının son olmayan aşamalarında görüntü boyutunu küçültme konusunda daha az endişeleniyorum. Bu aşamalar etiketlenip diğer düğümlere gönderilmediğinde, her komutu ayrı bir RUN
satıra bölerek önbelleğin yeniden kullanılması olasılığını en üst düzeye çıkarabilirsiniz .
Ancak bu, katmanları ezmek için mükemmel bir çözüm değildir çünkü aşamalar arasında kopyaladığınız her şey dosyalardır ve ortam değişkeni ayarları, giriş noktası ve komut gibi görüntü meta verilerinin geri kalanı değil. Ve bir linux dağıtımına paketleri kurduğunuzda, kitaplıklar ve diğer bağımlılıklar dosya sistemi boyunca dağılabilir ve bu da tüm bağımlılıkların bir kopyasını zorlaştırır.
Bu nedenle, bir CI / CD sunucusunda ikili dosyalar oluşturmanın yerine çok aşamalı yapıları kullanıyorum, böylece CI / CD sunucumun yalnızca çalıştırmak için docker build
araçlara sahip olması ve bir jdk, nodejs, go ve kurulu diğer derleme araçları.