Копія Dockerfile зберігає структуру підкаталога


257

Я намагаюся скопіювати декілька файлів і папок у збірку докерних зображень з мого localhost.

Файли виглядають так:

folder1
    file1
    file2
folder2
    file1
    file2

Я намагаюся зробити копію такою:

COPY files/* /files/

Однак усі файли розміщені у / files / чи є спосіб у Docker зберегти структуру підкаталогу, а також скопіювати файли у свої каталоги?


1
Ви могли б уточнити, який результат ви отримали і який результат очікуєте?
Thomasleveil

Відповіді:


413

Видаліть зірку зі списку COPY за допомогою цього Dockerfile:

FROM ubuntu
COPY files/ /files/
RUN ls -la /files/*

Структура є:

$ docker build .
Sending build context to Docker daemon 5.632 kB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu
 ---> d0955f21bf24
Step 1 : COPY files/ /files/
 ---> 5cc4ae8708a6
Removing intermediate container c6f7f7ec8ccf
Step 2 : RUN ls -la /files/*
 ---> Running in 08ab9a1e042f
/files/folder1:
total 8
drwxr-xr-x 2 root root 4096 May 13 16:04 .
drwxr-xr-x 4 root root 4096 May 13 16:05 ..
-rw-r--r-- 1 root root    0 May 13 16:04 file1
-rw-r--r-- 1 root root    0 May 13 16:04 file2

/files/folder2:
total 8
drwxr-xr-x 2 root root 4096 May 13 16:04 .
drwxr-xr-x 4 root root 4096 May 13 16:05 ..
-rw-r--r-- 1 root root    0 May 13 16:04 file1
-rw-r--r-- 1 root root    0 May 13 16:04 file2
 ---> 03ff0a5d0e4b
Removing intermediate container 08ab9a1e042f
Successfully built 03ff0a5d0e4b

64
Але що робити, якщо мені потрібні лише такі файли, як COPY files/*1 /files/?
Павло Агарков

1
Чи це також перезапише наявні файли у цьому каталозі?
чандер

1
@chander, так, наявні файли будуть перезаписані
ISanych

4
Важливо зауважити, що секретний соус тут полягає в тому, що є ОДНІЙ вихідний каталог і вказаний Один цільовий каталог. Будь-яка інша комбінація копіює вміст вихідного каталогу (-ів) у цільовий каталог.
Марцін

Я не зміг побачити вихід RUN ls -la /files/*безпосередньо з консольного виходу docker build. Тож я замість цього перейшов ssh до контейнера безпосередньо для того, щоб зробити це lsбезпосередньо на хості, зdocker exec -it <container name> /bin/bash
somenickname

32

Крім того, ви можете використовувати "." замість *, оскільки це займе всі файли в робочому каталозі, включіть папки та папки:

FROM ubuntu
COPY . /
RUN ls -la /

1
чи включатимуть приховані файли та файли на зразок каталогу .git?
Bruno Negrão Zica

7
@ BrunoNegrãoZica, ви можете використовувати .dockerignore файл, щоб вказати, які файли / папки ви хочете ігнорувати під час копіювання. Пізно, але сподіваюся, що це буде корисно для когось іншого
Гелларен

22

Щоб об'єднати локальний каталог у каталог у межах зображення, зробіть це. Він не видалить файли, які вже є у зображенні. Він додаватиме файли, які присутні локально, перезаписуючи файли на зображенні, якщо файл з однойменним файлом вже існує.

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