DockerJuniorCoding
Чем COPY отличается от ADD? Когда что использовать?
COPY — простое копирование из build context. ADD дополнительно распаковывает локальные tar-архивы и качает по URL. По умолчанию COPY; ADD — только для tar или ADD --checksum=sha256:... для remote бинарей.
Различие
COPY src dst делает ровно одно — копирует файлы из build context в слой образа. ADD делает то же плюс две магии:
- Автораспаковка локального tar-архива (
.tar,.tar.gz,.tgz,.tar.bz2,.tar.xz) в целевую директорию. - Скачивание по URL (
ADD https://...) — без verify checksum, без retry policy.
Начиная с BuildKit (Dockerfile 1.4+) у ADD появились флаги --checksum=sha256:<hex> и --keep-git-dir для git-источников.
Правило выбора
# syntax=docker/dockerfile:1.7
FROM node:22-bookworm-slim
WORKDIR /app
# COPY — для исходников, манифестов, конфигов
COPY package.json package-lock.json ./
RUN npm ci --omit=dev
COPY src ./src
# ADD с checksum — для remote бинаря
ADD --checksum=sha256:9b1f5d... https://example.com/tool-1.2.0.tar.gz /tmp/
RUN tar -xzf /tmp/tool-1.2.0.tar.gz -C /opt && rm /tmp/tool-1.2.0.tar.gz
# ADD локального архива — распаковывается автоматически
ADD rootfs.tar.gz /
Альтернатива через RUN
RUN curl -fsSL -o /tmp/tool.tgz https://example.com/tool-1.2.0.tar.gz \
&& echo '9b1f5d... /tmp/tool.tgz' | sha256sum -c - \
&& tar -xzf /tmp/tool.tgz -C /opt \
&& rm /tmp/tool.tgz
Явно: один слой, проверка целостности, удаление архива в том же слое (иначе он останется в image).
Подводные камни
ADD https://...без--checksum— supply chain риск: URL может изменить содержимое без смены хеша.ADDраспаковывает только локальные tar; remote tar просто скачивается как файл.- ZIP, 7z, RAR
ADDне распаковывает — нуженunzipвRUN. COPY --from=stage— единственный путь в multi-stage; уADD --fromтакого нет.- Cache invalidation:
ADD https://...инвалидирует кэш только по URL-строке, не по контенту — без--checksumможно получить stale бинарь. COPY --chown=user:groupи--chmod=0755работают и вADD, но менять права в одномRUNбывает чище.- Большие архивы через
ADDувеличивают размер слоя на распакованный объём — иногда выгоднее multi-stage сCOPY --from.
Common mistakes
- Использовать ADD как более короткий COPY без причины.
- Скачивать бинарники через ADD по URL без checksum verification.
- Не учитывать, что автоматическая распаковка может удивить следующего maintainer.
What the interviewer is testing
- Выбирает COPY как безопасный дефолт.
- Называет реальные дополнительные возможности ADD.
- Понимает риск remote artifacts и прозрачности supply chain.