Sobes.tech
Middle

Kādas ir labākās prakses, izmantojot instrukcijas ADD un COPY Docker?

sobes.tech AI

Atbilde no AI

Ir vairākas labākās prakses, kas saistītas ar ADD un COPY instrukcijām Docker, kas vērstas uz drošības, skaidrības un būvniecības efektivitātes uzlabošanu:

Galvenā atšķirība starp ADD un COPY:

  • COPY vienkārši nokopē failus un direktorijas no norādītā avota uz konteinerā norādīto mērķi. Avotam jābūt vietējam failam vai direktorijai.
  • ADD ir plašākas iespējas: tā var kopēt vietējos failus un direktorijas, kā arī izvilkt arhīvus (tar, gzip, bzip2) un saņemt failus no URL.

Labākās prakses:

  1. Izvēlieties COPY pār ADD: lielākajā daļā gadījumu pietiek ar COPY. Tas ir skaidrāks, jo vienkārši kopē vietējos failus. ADD izmantošana arhīvu izvilkšanai vai lejupielādei no URL var būt mazāk paredzama un palielina būvniecības sarežģītību.

  2. Izmantojiet COPY vietējiem failiem: ja jums jākopē faili no būvniecības konteksta uz attēlu, vienmēr izmantojiet COPY.

    # Tā vietā, lai izmantotu `ADD . /app`
    COPY . /app 
    
  3. Esiet uzmanīgs ar URL ADD: ADD ar URL izmantošana var novest pie nestabilitātes būvniecībā, ja attālais resurss nav pieejams. Tas arī var būt mazāk droši, jo jūs esat atkarīgs no ārēja avota. Ieteicams izmantot curl vai wget atsevišķā slānī (RUN) failu lejupielādei no URL, kas sniedz lielāku kontroli un ļauj veikt pārbaudi ar kontrolsummu.

    # Tā vietā, lai izmantotu `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. Izvilkiet arhīvus atsevišķā slānī, izmantojot ADD: ja jums ir jā izmanto ADD arhīva izvilkšanai (mazāk izplatīts scenārijs), pārliecinieties, ka to darāt atsevišķā slānī. Tomēr, kā minēts iepriekš, biežāk ir labāk izmantot RUN ar izvilkšanas komandu.

  5. Kopējiet tikai nepieciešamos failus: nekopējiet visu būvniecības kontekstu (COPY . /app), ja tajā ir nevajadzīgi faili (kods, testu dati, slēptas direktorijas utt.). Izmantojiet .dockerignore, lai izslēgtu šos failus. Tas samazina attēla izmēru un paātrina būvniecību, samazinot datu apjomu, kas tiek pārsūtīts Docker demonam.

    Piemērs .dockerignore:

    .git
    node_modules
    *.log
    tmp/
    
    # Kopējiet tikai nepieciešamos failus pēc `.dockerignore` piemērošanas
    COPY . /app
    
  6. Izmantojiet absolūtos ceļus mērķa norādīšanai: vienmēr norādiet absolūto ceļu uz mērķi attēlā (/app, /usr/local/bin utt.). Tas padara Dockerfile skaidrāku un paredzamu, izvairoties no nenoteiktības par pašreizējo darba direktoriju (WORKDIR).

    # Vienmēr norādiet absolūto ceļu
    COPY src /app/src
    
  7. Mainiet kārtību atkarībā no biežuma izmaiņām: novietojiet COPY vai ADD instrukcijas failiem, kas mainās retāk (piemēram, atkarību faili kā package.json, requirements.txt), augstāk Dockerfile, nekā failiem, kas mainās biežāk (programmas kods). Tas ļauj Docker efektīvi izmantot kešatmiņu.

    # Atkarību faili (mainās retāk)
    COPY requirements.txt /app/
    RUN pip install --no-cache-dir -r requirements.txt
    
    # Programmas kods (mainās biežāk)
    COPY . /app/ 
    

Kopsavilkuma tabula:

Instrukcija Apraksts Ieteicamā lietošana No kā izvairīties
COPY Kopē vietējos failus/direktorijas Kopēt vietējos failus un direktorijas uz attēlu. Ja nepieciešama arhīvu izvilkšana vai lejupielāde no URL, nelietojiet.
ADD Kopē vietējos failus/direktorijas, izvelk arhīvus, lejupielādē no URL Lietot arhīvu automātiskai izvilkšanai (retāk). Lietot tikai COPY. Lietot URL lejupielādei.

Šo praksi ievērošana ļauj izveidot drošākus, uzticamākus un efektīvākus Docker attēlus.