Ի՞նչ լավագույն պրակտիկաներ կան Docker-ում ADD և COPY հրահանգների օգտագործման համար։
sobes.tech AI
Պատասխան AI-ից
Դուք կարող եք օգտագործել ADD և COPY հրահանգները Docker- ում, բայց կան որոշ լավագույն պրակտիկա, որոնք պետք է հաշվի առնել՝ ապահովելու անվտանգությունը, թափանցիկությունը և պատկերի կառուցման արդյունավետությունը:
Հիմնական տարբերությունը ADD և COPY միջև:
COPYպարզապես պատճենում է ֆայլերը և დირექტորիաները նշված աղբյուրից հոստում՝ նշված նպատակակետին։ Աղբյուրը պետք է լինի տեղական ֆայլ կամ დირექტորիա։ADDունի ավելի լայն հնարավորություններ՝ այն կարող է պատճենել տեղական ֆայլեր և დირექტորիաներ, ինչպես նաև հանել արխիվներ (tar, gzip, bzip2) և ներբեռնել ֆայլեր URL- ից։
Լավագույն պրակտիկա:
-
Առաջնահերթությունը տվեք
COPY-ինADD-ի փոխարեն: Շատ դեպքերումCOPY-ն բավական է։ Այն ավելի թափանցիկ է, քանի որ պարզապես պատճենում է տեղական ֆայլերը։ADD-ն օգտագործել արխիվների հանման կամ URL- ից ներբեռնելու համար կարող է լինել պակաս կանխատեսելի և ավելացնել կառուցման բարդությունը։ -
Օգտագործեք
COPYտեղական ֆայլերի համար: Եթե անհրաժեշտ է պատճենել ֆայլեր կառուցման կոնտեքստից՝ դեպի պատկերը, միշտ օգտագործեքCOPY։# Փոխարենը `ADD . /app` COPY . /app -
Բարձրացրեք զգուշություն 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 -
Արխիվները հանեք առանձին շերտում
ADD-ի օգտագործման ժամանակ: Եթե պետք է օգտագործեքADD՝ արխիվը հանելու համար (քիչ տարածված սցենար), համոզվեք, որ դա անում եք առանձին շերտում։ Սակայն, ինչպես նշվեց՝ ավելի պարզ է օգտագործելRUN-ը։ -
Կատարյալ միայն անհրաժեշտ ֆայլերը: Մի պատճենեք ամբողջ կառուցման կոնտեքստը (
COPY . /app), եթե դրա մեջ կան անպետք ֆայլեր (կոդ, թեստային տվյալներ, թաքնված დირექტորիաներ և այլն): Օգտագործեք.dockerignore-ը՝ այդ ֆայլերը բացառելու համար։ Դա կրճատում է պատկերի չափը և արագացնում է կառուցումը՝ նվազեցնելով փոխանցվող տվյալների քանակը Docker- ի համար։Օրինակ
.dockerignore-ը:.git node_modules *.log tmp/# Միայն անհրաժեշտ ֆայլերը պատճենեք `.dockerignore`-ի կիրառումից հետո COPY . /app -
Օգտագործեք ամբողջական ճանապարհներ նշանակման համար: Ամեն ժամանակ նշեք ամբողջական ճանապարհը՝ նպատակակետում (/app, /usr/local/bin և այլն): Դա դարձնում է Dockerfile-ը ավելի հստակ և կանխատեսելի, խուսափելով ընթացիկ աշխատանքային գրացուցակի անհայտությունից (
WORKDIR)։# Ամեն ժամանակ նշեք ամբողջական ճանապարհը COPY src /app/src -
Փոփոխեք կարգը՝ հաճախականության վրա հիմնված փոփոխությունների հիման վրա: Դասավորեք
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 պատկերների հուսալիությունը, անվտանգությունը և արդյունավետությունը։