Kendine inanan minik Docker görselleri*

[Amerikan çocuk masalına atıf "Yapabilen Küçük Motor" - yakl. Lane]*

Kendine inanan minik Docker görselleri*

İhtiyaçlarınız için otomatik olarak küçük Docker görüntüleri nasıl oluşturulur?

Olağandışı Takıntı

Son birkaç aydır, bir Docker görüntüsünün ne kadar küçük olabileceğine ve uygulamanın hala çalışır durumda kalabileceğine kafayı taktım.

Anlıyorum, fikir tuhaf.

Detaylara ve teknik detaylara geçmeden önce bu sorunun beni neden bu kadar rahatsız ettiğini, sizi ne kadar ilgilendirdiğini açıklamak isterim.

Boyut neden önemlidir?

Docker görüntüsünün içeriğini azaltarak güvenlik açıklarının listesini azaltıyoruz. Ayrıca görüntüleri daha temiz hale getiriyoruz çünkü bunlar yalnızca uygulamaları çalıştırmak için gerekenleri içeriyor.

Küçük bir avantaj daha var - resimler biraz daha hızlı indiriliyor, ancak bence bu o kadar da önemli değil.

Lütfen unutmayın: Boyut konusunda endişeleriniz varsa, Alpine'in kendisi küçük görünüyor ve muhtemelen size uyacaktır.

Dağıtımsız görseller

Sorunsuz Proje temel "dağıtımsız" görüntülerden oluşan bir seçki sunar; bunlar, komut satırında görmeye alışkın olduğunuz paket yöneticilerini, kabukları ve diğer yardımcı programları içermez. Sonuç olarak, aşağıdaki gibi paket yöneticilerini kullanın: pip и apt çalışmayacak:

FROM gcr.io/distroless/python3
RUN  pip3 install numpy

Python 3 dağıtımsız görüntüsünü kullanan Docker dosyası

Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM gcr.io/distroless/python3
 ---> 556d570d5c53
Step 2/2 : RUN  pip3 install numpy
 ---> Running in dbfe5623f125
/bin/sh: 1: pip3: not found

Pip resimde yok

Genellikle bu sorun çok aşamalı bir yapıyla çözülür:

FROM python:3 as builder
RUN  pip3 install numpy

FROM gcr.io/distroless/python3
COPY --from=builder /usr/local/lib/python3.7/site-packages /usr/local/lib/python3.5/

Çok aşamalı montaj

Sonuç, 130 MB boyutunda bir görüntüdür. Çok da kötü değil! Karşılaştırma için: Varsayılan Python görüntüsü 929 MB ağırlığındadır ve "daha ince" olan (3,7-slim) - 179MB, dağ resmi (3,7-alpine) 98,6 MB iken örnekte kullanılan temel dağıtımız görüntü 50,9 MB'tır.

Önceki örnekte bir dizinin tamamını kopyaladığımızı belirtmekte fayda var. /usr/local/lib/python3.7/site-packagesihtiyacımız olmayan bağımlılıklar içerebilir. Mevcut tüm Python temel görüntülerinin boyut farkının farklılık gösterdiği açık olsa da.

Bu yazının yazıldığı sırada Google dağıtımsız pek çok görseli desteklemiyordu: Java ve Python hâlâ deneysel aşamadaydı ve Python yalnızca 2,7 ve 3,5 için mevcuttu.

Minik görüntüler

Küçük görseller yaratma takıntıma geri dönelim.

Genel olarak, distroless görüntülerin nasıl oluşturulduğunu görmek istedim. Dağıtımsız proje Google'ın derleme aracını kullanıyor bazel. Ancak Bazel'ı kurmak ve kendi görsellerinizi yazmak çok fazla çalışma gerektirdi (ve dürüst olmak gerekirse tekerleği yeniden icat etmek eğlenceli ve eğiticidir). Daha küçük görsellerin oluşturulmasını basitleştirmek istedim: Bir görsel yaratma eylemi son derece basit olmalı, banal. Böylece sizin için hiçbir yapılandırma dosyası kalmaz, konsolda yalnızca bir satır vardır: просто собрать образ для <приложение>.

Yani, kendi görsellerinizi oluşturmak istiyorsanız şunu bilin: çok benzersiz bir docker imajı var, scratch. Scratch "boş" bir görüntüdür, içinde hiçbir dosya yoktur, ancak varsayılan olarak ağırlığa sahiptir - vay be! - 77 bayt.

FROM scratch

Resmi çiz

Karalama görüntüsü fikri, ana makinedeki herhangi bir bağımlılığı ona kopyalayabilmeniz ve bunları bir Docker dosyası içinde kullanabilmenizdir (bu, onları bir Docker dosyasına kopyalamak gibidir). apt ve sıfırdan yükleyin) veya daha sonra Docker görüntüsü gerçekleştirildiğinde. Bu, Docker konteynerinin içeriğini tam olarak kontrol etmenize ve dolayısıyla görüntünün boyutunu tam olarak kontrol etmenize olanak tanır.

Şimdi bir şekilde bu bağımlılıkları toplamamız gerekiyor. Gibi mevcut araçlar apt paketleri indirmenize izin verir, ancak bunlar mevcut makineye bağlıdır ve sonuçta Windows veya MacOS'u desteklemezler.

Bu yüzden otomatik olarak mümkün olan en küçük boyutta bir temel görüntü oluşturacak ve aynı zamanda her türlü uygulamayı çalıştıracak kendi aracımı oluşturmaya koyuldum. Ubuntu/Debian paketlerini kullandım, bir seçim yaptım (paketleri doğrudan depolardan aldım) ve yinelemeli olarak bağımlılıklarını buldum. Programın paketin en son kararlı sürümünü otomatik olarak indirmesi ve güvenlik risklerini mümkün olduğunca en aza indirmesi gerekiyordu.

Aracın adını verdim fetchy, çünkü o... ihtiyacı olanı... bulur ve getirir.İngilizceden “getir”, “getir” - yakl. Lane] Araç bir komut satırı arayüzü üzerinden çalışır ancak aynı zamanda bir API sunar.

Bir görüntüyü kullanarak birleştirmek için fetchy (bu sefer bir Python görüntüsü alalım), CLI'yi şu şekilde kullanmanız yeterli: fetchy dockerize python. Hedef işletim sistemi ve kod adı istenebilir çünkü fetchy şu anda yalnızca Debian ve Ubuntu tabanlı paketleri kullanıyor.

Artık hangi bağımlılıklara hiç ihtiyaç duyulmadığını (bizim bağlamımızda) seçebilir ve bunları hariç tutabilirsiniz. Örneğin Python, Perl'e bağlıdır, ancak Perl kurulmadan da sorunsuz çalışır.

Bulgular

Komut kullanılarak oluşturulan Python görüntüsü fetchy dockerize python3.5 yalnızca 35 MB ağırlığındadır (gelecekte daha da hafiflenebileceğinden eminim). Sorunsuz görüntüden 15 WW'yi daha kesmeyi başardığımız ortaya çıktı.

Şu ana kadar toplanan tüm görselleri görebilirsiniz burada.

Proje - burada.

Eksik özellikler varsa, sadece bir istek oluşturun - yardımcı olmaktan memnuniyet duyarım :) Daha da fazlası, şu anda diğer paket yöneticilerini getiriciye entegre etmek için çalışıyorum, böylece çok aşamalı yapılara gerek kalmaz.

Kaynak: habr.com

Yorum ekle