Подтвердить что ты не робот

Как скопировать несколько файлов в один слой с помощью Dockerfile?

Следующий Dockerfile содержит четыре слоя COPY:

COPY README.md ./
COPY package.json ./
COPY gulpfile.js ./
COPY __BUILD_NUMBER ./

Как скопировать эти файлы с помощью одного слоя? Было опробовано следующее:

COPY [
    "__BUILD_NUMBER ./",
    "README.md ./",
    "gulpfile ./",
    "another_file ./",
]
4b9b3361

Ответ 1

COPY README.md package.json gulpfile.js __BUILD_NUMBER ./

или

COPY ["__BUILD_NUMBER", "README.md", "gulpfile", "another_file", "./"]

Вы также можете использовать подстановочные знаки в спецификации исходного файла. Посмотрите документы для более подробной информации.

Каталоги особенные! Если вы напишите

COPY dir1 dir2 ./

это на самом деле работает как

COPY dir1/* dir2/* ./

Если вы хотите скопировать несколько каталогов (не их содержимое) в целевой каталог в одной команде, вам нужно настроить контекст сборки так, чтобы ваши исходные каталоги находились под общим родителем, а затем COPY, чтобы родитель.

Ответ 2

COPY <all> <the> <things> <last-arg-is-destination>

Но вот важный отрывок из документации:

Если у вас есть несколько шагов Dockerfile, которые используют разные файлы из ваш контекст, скопируйте их индивидуально, а не все сразу. Этот гарантирует, что кэш сборки каждого шага будет только аннулирован (форсируя шаг для повторного запуска), если изменяются специально требуемые файлы.

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#add-or-copy

Ответ 3

простой

COPY README.md  package.json gulpfile.js __BUILD_NUMBER ./

из документа

Если указано несколько ресурсов, напрямую или из-за использование подстановочного знака, то должен быть каталог, и он должен заканчивается косой чертой /.

Ответ 4

Возможно, стоит упомянуть, что вы также можете создать файл .dockerignore, чтобы исключить файлы, которые вы не хотите копировать:

https://docs.docker.com/engine/reference/builder/#dockerignore-file

Прежде чем интерфейс командной строки docker отправляет контекст демону docker, он ищет файл с именем .dockerignore в корневом каталоге контекста. Если этот файл существует, CLI изменяет контекст, чтобы исключить файлы и каталоги, которые соответствуют шаблонам в нем. Это помогает избежать ненужной отправки больших или конфиденциальных файлов и каталогов демону и потенциального добавления их к изображениям с помощью ADD или COPY.