Копия Dockerfile сохраняет структуру подкаталогов

258

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

Файлы выглядят так:

folder1
    file1
    file2
folder2
    file1
    file2

Я пытаюсь сделать копию так:

COPY files/* /files/

Однако все файлы помещаются в / files /, есть ли способ в Docker сохранить структуру подкаталогов, а также скопировать файлы в их каталоги?

user1220022
источник
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
ISanych
источник
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
33

В качестве альтернативы вы можете использовать "." вместо *, так как это займет все файлы в рабочем каталоге, включите папки и подпапки:

FROM ubuntu
COPY . /
RUN ls -la /
Sparkz0629
источник
1
это будет включать в себя скрытые файлы и каталоги, такие как каталог .git?
Бруно Неграо Зика
7
@ BrunoNegrãoZica, вы можете использовать файл .dockerignore, чтобы указать, какие файлы / папки вы хотите игнорировать во время операции копирования. Уже поздно, но надеюсь, что это будет полезно для кого-то еще
Хелларен
22

Чтобы объединить локальный каталог в каталог в изображении, сделайте это. Это не удалит файлы, уже присутствующие в изображении. Он будет только добавлять файлы, которые присутствуют локально, перезаписывая файлы в изображении, если файл с таким именем уже существует.

COPY ./files/. /files/
Кэмерон Хадсон
источник