Docker'da ADD ve COPY talimatlarını kullanmak için en iyi uygulamalar nelerdir?
sobes.tech yapay zeka
AI'dan gelen yanıt
Docker'da ADD ve COPY komutları için, imajların güvenliğini, şeffaflığını ve verimliliğini artırmaya yönelik birkaç en iyi uygulama vardır.
ADD ve COPY arasındaki temel fark:
COPY, belirtilen kaynaktan ana makineden konteynere dosya ve dizinleri kopyalar. Kaynak, yerel bir dosya veya dizin olmalıdır.ADD, daha geniş yeteneklere sahiptir: yerel dosya ve dizinleri kopyalayabilir, arşivleri (tar, gzip, bzip2) çıkarabilir ve URL'lerden dosya indirebilir.
En iyi uygulamalar:
-
ADDyerineCOPYtercih edin: Çoğu durumda,COPYyeterlidir. Daha şeffaftır çünkü sadece yerel dosyaları kopyalar. Arşivleri çıkarmak veya URL'den indirmek içinADDkullanmak daha az öngörülebilir olabilir ve derleme karmaşasını artırabilir. -
Yerel dosyalar için
COPYkullanın: Derleme bağlamından imaja dosya kopylemeniz gerekiyorsa, her zamanCOPYkullanın.# `ADD` yerine COPY . /app -
ADDiçindeki URL'lere dikkat edin:ADDile URL kullanımı, uzak kaynak erişilebilir değilse derlemenin kararsız olmasına neden olabilir. Ayrıca, dış kaynağa bağımlı olduğu için daha az güvenli olabilir. Kaynakları URL üzerinden indirmek içincurlveyawgetkullanmak, daha fazla kontrol sağlar ve checksum doğrulamasına izin verir.# `ADD http://example.com/file.tar.gz /tmp/` RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/* \ && curl -fsSL http://example.com/file.tar.gz -o /tmp/file.tar.gz \ && tar -xzf /tmp/file.tar.gz -C /app \ && rm /tmp/file.tar.gz -
ADDkullanırken arşivleri ayrı bir katmanda çıkarın: Eğer zorunluysaADDile arşiv çıkarma işlemi yapmanız gerekiyorsa (daha az yaygın), bunu ayrı bir katmanda yapın. Ancak, yukarıda belirtildiği gibi, genellikleRUNile açıkça çıkarmak daha iyidir. -
Sadece gerekli dosyaları kopyalayın: Tüm derleme bağlamını (
COPY . /app) kopyalamayın, eğer içinde gereksiz dosyalar varsa (kaynak kodu, test verileri, gizli dizinler vb.). Bu dosyaları hariç tutmak için.dockerignorekullanın. Bu, imaj boyutunu küçültür ve Docker daemon'una iletilen veri miktarını azaltarak derleme hızını artırır..dockerignoreörneği:.git node_modules *.log tmp/# `.dockerignore` uygulandıktan sonra sadece gerekli dosyaları kopyalayın COPY . /app -
Hedefler için mutlak yollar kullanın: Her zaman
/app,/usr/local/bingibi mutlak yollar belirtin. Bu, Dockerfile'ı daha anlaşılır ve öngörülebilir hale getirir, çalışma dizini (WORKDIR) ile ilgili belirsizlikleri önler.# Mutlak hedef yolları kullanın COPY src /app/src -
Değişiklik sıklığına göre sıralamayı değiştirin: Daha az değişen dosyalar için (
package.json,requirements.txtgibi bağımlılık dosyaları),COPYveyaADDkomutlarını Dockerfile'ın üst kısmına yerleştirin; daha sık değişen dosyalar için (uygulama kaynak kodu) alt kısımlara yerleştirin. Bu, Docker'ın katman önbelleğini daha verimli kullanmasını sağlar.# Daha az değişen bağımlılık dosyaları COPY requirements.txt /app/ RUN pip install --no-cache-dir -r requirements.txt # Daha sık değişen uygulama kodu COPY . /app/
Özet tablo:
| Talimat | Açıklama | Tavsiye edilen kullanım | Kaçınılması gerekenler |
|---|---|---|---|
COPY |
Yerel dosya/dizinleri kopyalar | Yerel dosya ve dizinleri imaja kopyalamak. | Arşivleri çıkarmak veya URL'den indirmek gerekiyorsa kullanmayın. |
ADD |
Yerel dosya/dizinleri kopyalar, arşivleri çıkarır, URL'den indirir | Otomatik arşiv çıkarma için kullanılır (nadiren). | Yerel dosya kopyalamak için kullanmayın (COPY tercih edilir). URL'den indirme için kullanmayın. |
Bu uygulamaları takip etmek, daha güvenilir, güvenli ve verimli Docker imajları oluşturmanıza yardımcı olur.