Kokios yra geriausios praktikos naudojant instrukcijas ADD ir COPY Docker?
sobes.tech AI
Atsakymas iš AI
Yra keletas geriausių praktikų, susijusių su ADD ir COPY instrukcijomis Docker, kurios skirtos pagerinti saugumą, skaidrumą ir efektyvumą kuriant vaizdus:
Pagrindinis skirtumas tarp ADD ir COPY:
COPYtiesiog nukopijuoja failus ir katalogus iš nurodyto šaltinio į tikslą konteineryje. Šaltinis turi būti vietinis failas arba katalogas.ADDturi platesnes galimybes: gali kopijuoti vietinius failus ir katalogus, taip pat ištraukti archyvus (tar, gzip, bzip2) ir gauti failus iš URL.
Geriausios praktikos:
-
Pirmenybę teikite
COPYvietojADD: Daugeliu atvejų pakankaCOPY. Ji yra skaidresnė, nes tiesiog kopijuoja vietinius failus. NaudojimasADDarchyvų ištraukimui ar failų atsisiuntimui iš URL gali būti mažiau nuspėjamas ir sudėtingesnis. -
Naudokite
COPYvietiniams failams: Jei reikia kopijuoti failus iš kuriamos konteksto į vaizdą, visada naudokiteCOPY.# Vietoj `ADD . /app` COPY . /app -
Būkite atsargūs su URL
ADD: NaudojantADDsu URL gali sukelti nestabilumą, jei nuotolinis išteklius nėra pasiekiamas. Taip pat tai gali būti mažiau saugu, nes priklausote nuo išorinio šaltinio. Patartina naudoticurlarbawgetatskirame sluoksnyje (RUN) failų atsisiuntimui iš URL, tai suteikia daugiau kontrolės ir leidžia atlikti kontrolinės sumos patikrinimą.# Vietoj `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 -
Ištraukite archyvus atskirame sluoksnyje naudojant
ADD: Jei privalote naudotiADDarchyvų ištraukimui (mažiau paplitęs scenarijus), įsitikinkite, kad tai darote atskirame sluoksnyje. Tačiau, kaip minėta anksčiau, dažniausiai geriau naudotiRUNištraukimo komandą. -
Kopijuokite tik būtinus failus: Nekopijuokite viso konteksto (
COPY . /app), jei jame yra nereikalingų failų (kodo, testinių duomenų, paslėptų katalogų ir pan.). Naudokite.dockerignore, kad išvengtumėte šių failų. Tai sumažina vaizdo dydį ir pagreitina kūrimą, sumažindama duomenų kiekį, perduodamą Docker demonui.Pavyzdys
.dockerignore:.git node_modules *.log tmp/# Kopijuojame tik būtinus failus po `.dockerignore` taikymo COPY . /app -
Naudokite absoliučius kelių nurodymus: Visada nurodykite absoliučią kelią tikslui vaizde (/app, /usr/local/bin ir pan.). Tai daro Dockerfile aiškesnį ir nuspėjamesnį, išvengiant neapibrėžtumo dėl dabartinio darbo katalogo (
WORKDIR).# Visada nurodykite absoliučią kelią COPY src /app/src -
Keiskite tvarką priklausomai nuo dažnumo keičiamų failų: Išdėstykite
COPYarbaADDinstrukcijas failams, kurie keičiasi rečiau (pvz., priklausomybių failai kaippackage.json,requirements.txt), aukščiau Dockerfile, nei failams, kurie keičiasi dažniau (programos šaltinio kodas). Tai leidžia Docker efektyviai naudoti sluoksnių talpyklą.# Priklausomybės failai (keičiasi rečiau) COPY requirements.txt /app/ RUN pip install --no-cache-dir -r requirements.txt # Programos šaltinio kodas (keičiasi dažniau) COPY . /app/
Santrauka lentelė:
| Instrukcija | Aprašymas | Rekomenduojamas naudojimas | Ko reikėtų vengti |
|---|---|---|---|
COPY |
Kopijuoja vietinius failus/direktorijas | Kopijuoti vietinius failus ir direktorijas į vaizdą. | Naudoti, jei reikia galimybės ištraukti archyvus ar atsisiųsti iš URL. |
ADD |
Kopijuoja vietinius failus/direktorijas, ištraukia archyvus, atsisiunčia iš URL | Naudoti automatiškai ištraukiant archyvus (retai). | Naudoti tik COPY. Naudoti URL atsisiuntimui. |
Laikantis šių praktikų, kuriami patikimesni, saugesni ir efektyvesni Docker vaizdai.