Как скопировать несколько файлов в один слой, используя Dockerfile?

246

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

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

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

COPY [
    "__BUILD_NUMBER ./",
    "README.md ./",
    "gulpfile ./",
    "another_file ./",
]
kazhuravlev
источник

Ответы:

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

или

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

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

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

COPY dir1 dir2 ./

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

COPY dir1/* dir2/* ./

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

Натаниэль Вейсброт
источник
53
Обратите внимание, что если источником являются каталоги, это копирует содержимое каталога , а не сами каталоги.
Клаудиу
7
Также обратите внимание, что каталог назначения совпадает. Если вы делаете много разных файлов с разными назначениями, то вы можете рассмотреть возможность создания оверлейной файловой системы (например, chroot), затем превратить ее в tarархив и добавить ее с помощью ADD.
Tu-Reinstate Monica-dor duh
4
@Claudiu Как скопировать сами папки?
k0pernikus
5
@ k0pernikus вы можете сказать COPY myDir1 ./MyDir1/
Мануэль
@ manuel-manhart Есть ли кто-нибудь, кто знает, можем ли мы параметризировать список файлов, используя параметр сборки? github.com/moby/moby/issues/38532 ?
Марчелло де Сэйлс
52
COPY <all> <the> <things> <last-arg-is-destination>

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

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

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

swapsCAPS
источник
Вы знаете, можем ли мы параметризировать "все вещи" ??? Используя параметры сборки? github.com/moby/moby/issues/38532 ???
Марчелло де Сэйлс
@MarcellodeSales не уверены, зачем вам это нужно. Почему бы вам не создать базовое изображение без этих файлов, а затем в дочерних изображениях есть инструкция копирования - если им все равно нужно определить путь, это не имеет большого значения. Или вы можете просто не указывать образ (ы) полностью и смонтировать его в контейнер - там у вас есть файлы .env, которые можно настроить.
Мануэль
Также вы всегда можете скопировать существующий путь в любом случае, поскольку файловая система является многоуровневой, она будет перекрывать / скрывать ранее существующее содержимое.
Мануэль
@ManuelManhart, я создаю динамическое параметризованное изображение с помощью ONBUILD COPY ... Как часть платформы, я скрываю сложность того, что нужно сделать в изображении, поэтому мне нужно предоставить значения в качестве параметра.
Марчелло де Сэйлс
@MarcellodeSales Я не думаю, что это поддерживается сейчас / пока. Но вы можете использовать аргументы сборки для инкапсуляции, см. Stackoverflow.com/questions/43654656/…
Мануэль
7

просто

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

из документа

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

Эдвин Икечукву Оконкво
источник
6

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

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

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

Аарон
источник