Sobes.tech
Middle

Ի՞նչ լավագույն պրակտիկաներ կան Docker-ում ADD և COPY հրահանգների օգտագործման համար։

sobes.tech AI

Պատասխան AI-ից

Դուք կարող եք օգտագործել ADD և COPY հրահանգները Docker- ում, բայց կան որոշ լավագույն պրակտիկա, որոնք պետք է հաշվի առնել՝ ապահովելու անվտանգությունը, թափանցիկությունը և պատկերի կառուցման արդյունավետությունը:

Հիմնական տարբերությունը ADD և COPY միջև:

  • COPY պարզապես պատճենում է ֆայլերը և დირექტորիաները նշված աղբյուրից հոստում՝ նշված նպատակակետին։ Աղբյուրը պետք է լինի տեղական ֆայլ կամ დირექტորիա։
  • ADD ունի ավելի լայն հնարավորություններ՝ այն կարող է պատճենել տեղական ֆայլեր և დირექტորիաներ, ինչպես նաև հանել արխիվներ (tar, gzip, bzip2) և ներբեռնել ֆայլեր URL- ից։

Լավագույն պրակտիկա:

  1. Առաջնահերթությունը տվեք COPY-ին ADD-ի փոխարեն: Շատ դեպքերում COPY-ն բավական է։ Այն ավելի թափանցիկ է, քանի որ պարզապես պատճենում է տեղական ֆայլերը։ ADD-ն օգտագործել արխիվների հանման կամ URL- ից ներբեռնելու համար կարող է լինել պակաս կանխատեսելի և ավելացնել կառուցման բարդությունը։

  2. Օգտագործեք COPY տեղական ֆայլերի համար: Եթե անհրաժեշտ է պատճենել ֆայլեր կառուցման կոնտեքստից՝ դեպի պատկերը, միշտ օգտագործեք COPY։

    # Փոխարենը `ADD . /app`
    COPY . /app 
    
  3. Բարձրացրեք զգուշություն URL- ի հետ ADD-ում: ADD-ի օգտագործումը URL- ի հետ կարող է հանգեցնել կառուցման անկայունության, եթե հեռավոր ռեսուրսը հասանելի չէ։ Դա կարող է լինել նաև ավելի անապահով, քանի որ դուք կախված եք արտաքին աղբյուրից։ Ավելի լավ է օգտագործել curl կամ wget առանձին շերտում (RUN)՝ ռեսուրսները ներբեռնելու համար, ինչը տալիս է ավելի մեծ վերահսկողություն և թույլ է տալիս իրականացնել ստուգման սեղմում։

    # Փոխարենը `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-ի օգտագործման ժամանակ: Եթե պետք է օգտագործեք ADD՝ արխիվը հանելու համար (քիչ տարածված սցենար), համոզվեք, որ դա անում եք առանձին շերտում։ Սակայն, ինչպես նշվեց՝ ավելի պարզ է օգտագործել RUN-ը։

  5. Կատարյալ միայն անհրաժեշտ ֆայլերը: Մի պատճենեք ամբողջ կառուցման կոնտեքստը (COPY . /app), եթե դրա մեջ կան անպետք ֆայլեր (կոդ, թեստային տվյալներ, թաքնված დირექტորիաներ և այլն): Օգտագործեք .dockerignore-ը՝ այդ ֆայլերը բացառելու համար։ Դա կրճատում է պատկերի չափը և արագացնում է կառուցումը՝ նվազեցնելով փոխանցվող տվյալների քանակը Docker- ի համար։

    Օրինակ .dockerignore-ը:

    .git
    node_modules
    *.log
    tmp/
    
    # Միայն անհրաժեշտ ֆայլերը պատճենեք `.dockerignore`-ի կիրառումից հետո
    COPY . /app
    
  6. Օգտագործեք ամբողջական ճանապարհներ նշանակման համար: Ամեն ժամանակ նշեք ամբողջական ճանապարհը՝ նպատակակետում (/app, /usr/local/bin և այլն): Դա դարձնում է Dockerfile-ը ավելի հստակ և կանխատեսելի, խուսափելով ընթացիկ աշխատանքային գրացուցակի անհայտությունից (WORKDIR

    # Ամեն ժամանակ նշեք ամբողջական ճանապարհը
    COPY src /app/src
    
  7. Փոփոխեք կարգը՝ հաճախականության վրա հիմնված փոփոխությունների հիման վրա: Դասավորեք COPY կամ ADD հրահանգները՝ այն ֆայլերի համար, որոնք փոփոխվում են ավելի հազվադեպ (օրինակ՝ կախված ֆայլեր՝ package.json, requirements.txt), ավելի վերևում Dockerfile-ում, քան այն ֆայլերի համար, որոնք փոփոխվում են ավելի հաճախ (առավել հաճախ փոփոխվող կոդը): Դա թույլ է տալիս Docker- ին արդյունավետ օգտագործել շերտերի կեշը։

    # Կախված ֆայլեր (փոխվում են ավելի հազվադեպ)
    COPY requirements.txt /app/
    RUN pip install --no-cache-dir -r requirements.txt
    
    # Կիրառման կոդ (փոխվում է ավելի հաճախ)
    COPY . /app/ 
    

Ամփոփ աղյուսակ:

Հրաման Նկարագրություն Առաջարկվող օգտագործում Ինչից խուսափել
COPY Լոկալ ֆայլեր/դիրեկտորիաներ պատճենում է Լոկալ ֆայլեր և դիրեկտորիաներ պատճենել պատկերի մեջ։ Եթե անհրաժեշտ է արխիվներ հանել կամ URL- ից ներբեռնել։
ADD Լոկալ ֆայլեր/դիրեկտորիաներ պատճենում է, արխիվներ հանում, URL- ից ներբեռնում Օգտագործել ավտոմատ արխիվների հանման համար (քիչ դեպքերում) Օգտագործել միայն COPY-ի փոխարեն։ Օգտագործել URL- ից ներբեռնում։

Այս պրակտիկաները պահպանում են Docker պատկերների հուսալիությունը, անվտանգությունը և արդյունավետությունը։