2016-06-13 21 views
9

Ho provato il seguente comando nel mio Dockerfile: COPY * / e sono rimasto molto sorpreso dal risultato. Sembra che l'ingenuo codice docker attraversi le directory dal glob e poi scarichi ogni file nella directory di destinazione ignorando rispettosamente la mia struttura di directory.Come copiare le cartelle nell'immagine docker da Dockerfile?

Almeno questo è il modo in cui ho capito this ticket e corrisponde sicuramente al risultato ottenuto.

Immagino che l'unico motivo per cui questo comportamento possa ancora esistere deve essere che ci sia un altro modo in cui questo dovrebbe essere fatto. Ma non è così facile per un orso di pochissimo cervello capire come, qualcuno lo sa?

risposta

6

Come mentioned in your ticket:

Hai COPY files/* /test/ che si espande a COPY files/dir files/file1 files/file2 files/file /test/.
Se dividi questo in singoli comandi COPY (ad esempio COPY files/dir /test/) vedrai che (nel bene o nel male) COPY copierà il contenuto di ciascun argomento dir nella directory di destinazione. Non l'arg dir stesso, ma il contenuto.

Non sono entusiasta del fatto che COPY non conserva la directory principale, ma è così da un po 'di tempo.

in nome di conservare una compatibilità, non è possibile COPY/ADD una struttura di directory.

L'unica soluzione alternativa sarebbe una serie di RUN mkdir -p /x/y/z per creare la struttura di directory di destinazione, seguita da una serie di docker COPY (una per ogni cartella da riempire).

2

utilizzare ADD anziché COPY. Si supponga di voler copiare tutto nella directory src da host a directory dst dal contenitore:

ADD src dst 

Nota: b verrà creato automaticamente in un contenitore.

+2

Che cos'è 'b'? E https://github.com/docker/docker/issues/18396 suggerisce che ADD non crea sottocartelle. – VonC

+0

La tua risposta non è chiara, ma potrei ottenere il punto che stai cercando di dire e ho trovato la mia risposta sopra. Funziona bene. –

6

Come ha detto @Vonc, non è possibile aggiungere un comando come al momento. L'unica soluzione è menzionare la cartella, crearla e aggiungervi contenuti.

# add contents to folder 
ADD src $HOME/src 

creerebbe una cartella chiamata src nella directory e aggiungere contenuto della cartella src in questo.