Беҳтарин амалҳо барои истифодаи дастурҳои ADD ва COPY дар Docker кадомҳоянд?
sobes.tech AI
Ҷавоб аз AI
Для інструкцій ADD і COPY у Docker існує кілька найкращих практик, спрямованих на підвищення безпеки, прозорості та ефективності збірки образів.
Основна різниця між ADD і COPY:
COPYпросто копіює файли та директорії з вказаного джерела на хості у вказане місце призначення в контейнері. Джерело має бути локальним файлом або директорією.ADDмає ширші можливості: вона може копіювати локальні файли та директорії, а також витягати архіви (tar, gzip, bzip2) і отримувати файли з URL.
Кращі практики:
-
Віддавайте перевагу
COPYпередADD: У більшості випадків достатньоCOPY. Вона більш прозора, оскільки просто копіює локальні файли. ВикористанняADDдля витягання архівів або завантаження з URL може бути менш передбачуваним і збільшувати складність збірки. -
Використовуйте
COPYдля локальних файлів: Якщо потрібно скопіювати файли з контексту збірки в образ, завжди використовуйтеCOPY.# Замість ADD . /app COPY . /app -
Будьте обережні з 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 -
Витягуйте архіви у окремому шарі при використанні
ADD: Якщо ви повинні використовуватиADDдля витягання архіву (менш поширений сценарій), переконайтеся, що ви робите це у окремому шарі. Однак, як згадувалося раніше, часто більш явне витягання за допомогоюRUNє переважнішим. -
Копіюйте лише необхідні файли: Не копіюйте весь контекст збірки (
COPY . /app), якщо в ньому є непотрібні файли (джерельний код, тестові дані, приховані директорії тощо). Використовуйте.dockerignoreдля виключення цих файлів. Це зменшує розмір образу і прискорює збірку за рахунок зменшення обсягу даних, що передаються Docker-демону.Приклад
.dockerignore:.git node_modules *.log tmp/# Копіюємо лише необхідні файли після застосування `.dockerignore` COPY . /app -
Використовуйте абсолютні шляхи для призначення: Завжди вказуйте абсолютний шлях призначення в образі (/app, /usr/local/bin тощо). Це робить Dockerfile більш зрозумілим і передбачуваним, уникаючи невизначеності щодо поточного робочого каталогу (
WORKDIR).# Завжди вказуйте абсолютний шлях призначення COPY src /app/src -
Варіюйте порядок залежно від частоти змін: Розміщуйте інструкції
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.