Sobes.tech
Middle

Docker'da ADD va COPY ko'rsatmalaridan foydalanish uchun eng yaxshi amaliyotlar qanday?

sobes.tech AI

AIdan javob

Docker'da ADDCOPY əmrləri üçün, şəkillərin təhlükəsizliyini, şəffaflığını və səmərəliliyini artırmağa yönəlmiş bir neçə ən yaxşı praktika mövcuddur.

ADDCOPY arasındakı əsas fərq:

  • COPY sadəcə olaraq, hostdakı göstərilən mənbədən konteynerdəki hədəfə faylları və qovluqları köçürür. Mənbə yerli fayl və ya qovluq olmalıdır.
  • ADD daha geniş imkanlara malikdir: yerli fayl və qovluqları köçürə bilər, arxivləri (tar, gzip, bzip2) çıxara və URL-dən fayllar yükləyə bilər.

Ən yaxşı praktika:

  1. ADD yerinə COPY istifadə edin: Əksər hallarda, COPY kifayət edir. Bu daha şəffafdır, çünki sadəcə yerli faylları köçürür. Arxivləri çıxarmaq və ya URL-dən yükləmək üçün ADD istifadə etmək daha az proqnozlaşdırıla bilər və inşaatı çətinləşdirə bilər.

  2. Yerli fayllar üçün COPY istifadə edin: Əgər inşaat kontekstindən imaga fayllar köçürməlisinizsə, həmişə COPY istifadə edin.

    # `ADD` yerinə
    COPY . /app 
    
  3. ADD içindəki URL-lərə diqqət yetirin: ADD ilə URL istifadə etmək, uzaq resurs əlçatan olmadıqda inşaatın stabilliyinə təsir edə bilər. Bundan əlavə, bu daha az təhlükəsiz ola bilər, çünki xarici mənbəyə bağlıdır. URL-dən resurs yükləmək üçün curl və ya wget istifadə etmək daha yaxşıdır və bu, daha çox nəzarət və yoxlama imkanı 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 istifadə edərkən arxivləri ayrı bir qatmanda çıxarın: Əgər zəruri olsa, ADD ilə arxiv çıxarmaq üçün istifadə edirsinizsə (daha az yaygın), bunu ayrı bir qatmanda edin. Ancaq, əvvəlki kimi, adətən, RUN ilə açıq şəkildə çıxarmaq daha yaxşıdır.

  5. Yalnız lazım olan faylları köçürün: Bütün inşaat kontekstini (COPY . /app) köçürməyin, əgər içində lazımsız fayllar (mənbə kodu, test məlumatları, gizli qovluqlar və s.) varsa. Bu faylları istisna etmək üçün .dockerignore istifadə edin. Bu, imicin ölçüsünü azaldır və inşaatı sürətləndirir, çünki Docker demonuna ötürülən məlumatların miqdarını azaldır.

    .dockerignore nümunəsi:

    .git
    node_modules
    *.log
    tmp/
    
    # `.dockerignore` tətbiq edildikdən sonra yalnız lazım olan faylları köçürün
    COPY . /app
    
  6. Hədəflər üçün mütləq yollar istifadə edin: Həmişə /app, /usr/local/bin və s. kimi mütləq yollar göstərin. Bu, Dockerfile-i daha anlaşılan və proqnozlaşdırıla bilən edir, cari iş qovluğunun (WORKDIR) qeyri-müəyyənliyindən qaçınır.

    # Həmişə mütləq yollar göstərin
    COPY src /app/src
    
  7. Dəyişiklik tezliyinə görə sıralamayı dəyişin: COPY və ya ADD əmrlərini, daha az dəyişən fayllar üçün (məsələn, package.json, requirements.txt kimi asılılıq faylları), Dockerfile-in yuxarısına yerləşdirin və daha çox dəyişən fayllar üçün (tətbiq mənbə kodu) aşağıya yerləşdirin. Bu, Docker-ın qatların keşi istifadə etməsini daha səmərəli edir.

    # Asılılıq faylları (daha az dəyişir)
    COPY requirements.txt /app/
    RUN pip install --no-cache-dir -r requirements.txt
    
    # Tətbiq mənbə kodu (daha çox dəyişir)
    COPY . /app/ 
    

Qısa cədvəl:

Əmr Təsviri Tövsiyə olunan istifadə Nədən qaçınmaq lazımdır
COPY Yerli fayl/dizinləri köçürür Yerli fayl və dizinləri imaga köçürmək. Arxivləri çıxarmaq və ya URL-dən yükləmək lazım olarsa istifadə etməyin.
ADD Yerli fayl/dizinləri köçürür, arxivləri çıxarır, URL-dən yükləyir Avtomatik arxiv çıxarma üçün istifadə olunur (nadirdir). Yerli faylları köçürmək üçün istifadə etməyin (COPY üstünlükdür). URL-dən yükləmək üçün istifadə edin.

Bu praktikalara riayət etmək, daha etibarlı, təhlükəsiz və səmərəli Docker imajlarının yaradılmasına kömək edir.