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


следующее Dockerfile четыре COPY слоев:

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

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

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

3 ответа:

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

или

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

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

каталоги-это специальные! если вы пишите

COPY dir1 dir2 ./

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

COPY dir1/* dir2/* ./

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

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

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

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

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

простой

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

С doc

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