Як скопіювати кілька файлів в один шар за допомогою Dockerfile?


246

Далі Dockerfileміститься чотири COPYшари:

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

Як скопіювати ці файли за допомогою одного шару? Було випробувано наступне:

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

Відповіді:


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

@ manuel-manhart Хтось знає, чи можемо ми параметризувати список файлів за допомогою параметра Build? github.com/moby/moby/isissue/38532 ?
Marcello de Sales

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

Але ось важливий уривок із документів:

Якщо у вас є кілька кроків Dockerfile, які використовують різні файли з вашого контексту, КОПУЙТЕ їх окремо, а не всі відразу. Це гарантує, що кеш збірки кожного кроку буде недійсним (змушує повторно виконувати крок), якщо зміниться спеціально необхідні файли.

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


чи знаєте ви, чи можемо ми параметризувати "всі речі" ??? Використовуючи параметри збірки? github.com/moby/moby/isissue/38532 ???
Marcello de Sales

@MarcellodeSales не впевнений, навіщо вам це потрібно. Чому ви не створюєте базове зображення без цих файлів, а потім дочірні зображення містять інструкцію щодо копіювання - якщо їм все одно потрібно визначити шлях, це не має великої різниці. Або ви можете просто залишити його із зображення (зображень) повністю і встановити його в контейнер - там у вас є .env файли, які мають це налаштовувати.
Мануель

Також ви завжди можете скопіювати існуючий шлях у будь-якому випадку, оскільки файлова система є багатошаровою, вона буде перекривати / затінювати попередньо існуючий вміст.
Мануель

@ManuelManhart, я будую динамічне параметризоване зображення з ONBUILD COPY ... Як частина платформи, я приховую складність того, що потрібно зробити на зображенні, тож саме тому мені потрібно вказати значення як параметр.
Marcello de Sales

@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

Перш ніж CLI докера надсилає контекст докерному демону, він шукає файл з назвою .dockerignore у кореневій каталозі контексту. Якщо цей файл існує, CLI змінює контекст, щоб виключити файли та каталоги, що відповідають шаблонам. Це допомагає уникнути зайвого надсилання великих та чутливих файлів та каталогів демону та потенційно додавати їх до зображень за допомогою ADD або COPY.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.