Sobes.tech
Middle

Беҳтарин амалҳо барои истифодаи дастурҳои ADD ва COPY дар Docker кадомҳоянд?

sobes.tech AI

Ҷавоб аз AI

Для інструкцій 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.

Дотримання цих практик призводить до створення більш надійних, безпечних і ефективних образів Docker.