Sobes.tech
Middle

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:

  1. ADD yerine COPY tercih edin: Çoğu durumda, COPY yeterlidir. Daha şeffaftır çünkü sadece yerel dosyaları kopyalar. Arşivleri çıkarmak veya URL'den indirmek için ADD kullanmak daha az öngörülebilir olabilir ve derleme karmaşasını artırabilir.

  2. Yerel dosyalar için COPY kullanın: Derleme bağlamından imaja dosya kopylemeniz gerekiyorsa, her zaman COPY kullanın.

    # `ADD` yerine
    COPY . /app 
    
  3. ADD içindeki URL'lere dikkat edin: ADD ile 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çin curl veya wget kullanmak, 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
    
  4. ADD kullanırken arşivleri ayrı bir katmanda çıkarın: Eğer zorunluysa ADD ile arşiv çıkarma işlemi yapmanız gerekiyorsa (daha az yaygın), bunu ayrı bir katmanda yapın. Ancak, yukarıda belirtildiği gibi, genellikle RUN ile açıkça çıkarmak daha iyidir.

  5. 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 .dockerignore kullanı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
    
  6. Hedefler için mutlak yollar kullanın: Her zaman /app, /usr/local/bin gibi 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
    
  7. Değişiklik sıklığına göre sıralamayı değiştirin: Daha az değişen dosyalar için (package.json, requirements.txt gibi bağımlılık dosyaları), COPY veya ADD komutları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.