La copia di Dockerfile mantiene la struttura delle sottodirectory


283

Sto cercando di copiare un numero di file e cartelle in un'immagine docker creata dal mio localhost.

I file sono così:

folder1
    file1
    file2
folder2
    file1
    file2

Sto cercando di fare la copia in questo modo:

COPY files/* /files/

Tuttavia, tutti i file vengono inseriti in / files / c'è un modo in Docker per mantenere la struttura delle sottodirectory e copiare i file nelle loro directory?


1
potresti chiarire quale risultato hai ottenuto e quale risultato ti aspetti?
Thomasleveil

Risposte:


449

Rimuovi la stella dalla COPIA, con questo Dockerfile:

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

La struttura è lì:

$ 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

71
Ma cosa succede se ho bisogno solo di alcuni file come COPY files/*1 /files/?
Pavel Agarkov

1
Questo sovrascriverà anche i file esistenti in quella directory?
chander

1
@chander, sì, i file esistenti verranno sovrascritti
ISanych

6
È importante notare che il segreto qui è che c'è UNA directory di origine e UNA directory di destinazione specificata. Qualsiasi altra combinazione copia il contenuto delle directory di origine nella directory di destinazione.
Marcin

1
Questo non ha funzionato per me durante la compilazione da ibmcom / websphere-liberty: kernel-java8-ibmjava-ubi su macos. Nemmeno il resto delle soluzioni in questo post lo ha fatto.
Georgios F.

43

In alternativa puoi usare un "." invece di *, poiché questo richiederà tutti i file nella directory di lavoro, includi le cartelle e le sottocartelle:

FROM ubuntu
COPY . /
RUN ls -la /

1
includerà file e directory nascosti come la directory ".git"?
Bruno Negrão Zica

7
@ BrunoNegrãoZica, puoi usare il file .dockerignore per specificare quali file / cartelle desideri vengano ignorati durante l'operazione di copia. È tardi, ma spero che possa essere utile per qualcun altro
Hellaren

29

Per unire una directory locale in una directory all'interno di un'immagine, eseguire questa operazione. Non eliminerà i file già presenti nell'immagine. Aggiungerà solo file presenti localmente, sovrascrivendo i file nell'immagine se esiste già un file con lo stesso nome.

COPY ./files/. /files/

1

Se desideri copiare una directory di origine interamente con la stessa struttura di directory, non utilizzare una stella (*). Scrivi il comando COPY in Dockerfile come di seguito.

COPY . destinatio-directory/ 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.