Kopia pliku Dockerfile zachowuje strukturę podkatalogu

257

Próbuję skopiować kilka plików i folderów do kompilacji obrazu dokera z mojego lokalnego hosta.

Pliki są takie:

folder1
    file1
    file2
folder2
    file1
    file2

Próbuję wykonać kopię w ten sposób:

COPY files/* /files/

Jednak wszystkie pliki są umieszczane w / files / czy istnieje sposób w Docker, aby zachować strukturę podkatalogu, a także kopiować pliki do ich katalogów?

użytkownik1220022
źródło
1
czy możesz wyjaśnić, jaki wynik uzyskasz i jakiego rezultatu oczekujesz?
Thomasleveil

Odpowiedzi:

413

Usuń gwiazdkę z KOPIUJ, za pomocą tego pliku Docker:

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

Struktura jest tam:

$ 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
źródło
64
Ale co, jeśli potrzebuję tylko niektórych plików COPY files/*1 /files/?
Pavel Agarkov
1
Czy spowoduje to również zastąpienie istniejących plików w tym katalogu?
Chander
1
@chander, tak, istniejące pliki zostaną nadpisane
ISanych
4
Ważne jest, aby pamiętać, że sekretnym sosem jest tutaj JEDEN katalog źródłowy i JEDEN katalog docelowy. Każda inna kombinacja kopiuje zawartość katalogu (ów) źródłowego do katalogu docelowego.
Marcin
Nie byłem w stanie zobaczyć wyjścia RUN ls -la /files/*bezpośrednio z wyjścia konsoli docker build. Zamiast tego poszedłem ssh do kontenera, aby zrobić lsbezpośrednio na hoście, zdocker exec -it <container name> /bin/bash
somenickname
32

Alternatywnie możesz użyć „.” zamiast *, ponieważ zajmie to wszystkie pliki w katalogu roboczym, dołącz foldery i podfoldery:

FROM ubuntu
COPY . /
RUN ls -la /
Sparkz0629
źródło
1
czy będzie to obejmować ukryte pliki i katalogi, takie jak katalog „.git”?
Bruno Negrão Zica,
7
@ BrunoNegrãoZica, możesz użyć pliku .dockerignore, aby określić, które pliki / foldery chcesz zignorować podczas operacji kopiowania. Jest późno, ale mam nadzieję, że byłby pomocny dla kogoś innego
Hellaren
22

Aby scalić katalog lokalny z katalogiem na obrazie, zrób to. Nie usunie plików już obecnych na obrazie. Będzie dodawać tylko pliki, które są obecne lokalnie, zastępując pliki na obrazie, jeśli plik o tej samej nazwie już istnieje.

COPY ./files/. /files/
Cameron Hudson
źródło