Sobes.tech
Middle

Koje su najbolje prakse za korišćenje instrukcija ADD i COPY u Docker-u?

sobes.tech АИ

Одговор од АИ

Постоји неколико најбољих пракси за команду 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) за преузимање ресурса преко URL-а, што пружа већу контролу и могућност провере контролних сума.

    # Уместо `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-а користите ADD.

Поштовање ових пракси доводи до стварања поузданијих, безбеднијих и ефикаснијих Docker слика.