COPY только копирует файлы и директории из контекста сборки в образ. ADD дополнительно умеет распаковывать tar-архивы и скачивать файлы по URL. Best practice - использовать COPY, если не нужны эти возможности.
COPY package.json ./
COPY src/ /app/src/
# Предсказуемо: берёт только то, что указано
ADD archive.tar.gz /opt/ # распакует в /opt/
ADD https://example.com/file.tar.gz /tmp/ # скачает (не рекомендуется: кеш сложнее)
Если нужна распаковка - лучше COPY archive.tar.gz /tmp/ и отдельно RUN tar -xzf /tmp/archive.tar.gz -C /opt/.