Sobes.tech
Middle

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:

  • COPY tiesiog nukopijuoja failus ir katalogus iš nurodyto šaltinio į tikslą konteineryje. Šaltinis turi būti vietinis failas arba katalogas.
  • ADD turi platesnes galimybes: gali kopijuoti vietinius failus ir katalogus, taip pat ištraukti archyvus (tar, gzip, bzip2) ir gauti failus iš URL.

Geriausios praktikos:

  1. Pirmenybę teikite COPY vietoj ADD: Daugeliu atvejų pakanka COPY. Ji yra skaidresnė, nes tiesiog kopijuoja vietinius failus. Naudojimas ADD archyvų ištraukimui ar failų atsisiuntimui iš URL gali būti mažiau nuspėjamas ir sudėtingesnis.

  2. Naudokite COPY vietiniams failams: Jei reikia kopijuoti failus iš kuriamos konteksto į vaizdą, visada naudokite COPY.

    # Vietoj `ADD . /app`
    COPY . /app 
    
  3. Būkite atsargūs su URL ADD: Naudojant ADD su 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 naudoti curl arba wget atskirame 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
    
  4. Ištraukite archyvus atskirame sluoksnyje naudojant ADD: Jei privalote naudoti ADD archyvų ištraukimui (mažiau paplitęs scenarijus), įsitikinkite, kad tai darote atskirame sluoksnyje. Tačiau, kaip minėta anksčiau, dažniausiai geriau naudoti RUN ištraukimo komandą.

  5. 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
    
  6. 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
    
  7. Keiskite tvarką priklausomai nuo dažnumo keičiamų failų: Išdėstykite COPY arba ADD instrukcijas failams, kurie keičiasi rečiau (pvz., priklausomybių failai kaip package.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.