2015-07-26 13 views
11

Sto provando a copiare un singolo file dalla radice del contesto di compilazione in una directory appena creata in un'immagine docker.Come utilizzare le istruzioni COPY/ADD del Docker per copiare un singolo file in un'immagine

Il Dockerfile che sto utilizzando è il seguente:

FROM debian:latest 
RUN mkdir -p /usr/src/app 
WORKDIR /usr/src/app 
COPY test.txt /usr/src/app 

Il file test.txt è un semplice file di testo ASCII come segue:

$ cat test.txt 
This is a test 

Tuttavia, quando ho costruito questa immagine I ottenere un'immagine affermando che il percorso di destinazione non è una directory.

$ docker build . 
Sending build context to Docker daemon 4.608 kB 
Sending build context to Docker daemon 
Step 0 : FROM debian:latest 
---> 9a61b6b1315e 
Step 1 : RUN mkdir -p /usr/src/app 
---> Using cache 
---> 86bd44a8776e 
Step 2 : WORKDIR /usr/src/app 
---> Using cache 
---> ed6771adc681 
Step 3 : ADD test.txt /usr/src/app 
stat /var/lib/docker/devicemapper/mnt/ee5b9b7029f2adf27d332cbb0d98d6ad9927629a7569fd2d9574cb767b23547b/rootfs/usr/src/app/test.txt: not a directory 

Ho provato a utilizzare più combinazioni di versioni di finestra mobile, immagini di base e distribuzioni con finestra mobile installata. Ho anche provato ad usare ADD invece di COPY ma il risultato è lo stesso.

Attualmente sto cercando questo su CentOS 7 con la seguente versione finestra mobile installata:

Client version: 1.7.1 
Client API version: 1.19 
Go version (client): go1.4.2 
Git commit (client): 786b29d 
OS/Arch (client): linux/amd64 
Server version: 1.7.1 
Server API version: 1.19 
Go version (server): go1.4.2 
Git commit (server): 786b29d 
OS/Arch (server): linux/amd64 

Quello che ho notato è che posso copiare una directory, ma non è un file. Ad esempio, se creo una directory "test" nella radice contesto costruire e mettere test.txt all'interno della directory di prova allora posso copiare la directory con successo:

FROM debian:latest 
RUN mkdir -p /usr/src/app 
WORKDIR /usr/src/app 
COPY test /usr/src/app 

Si noti che nel precedente Dockerfile copio l'intero ./test directory anziché solo ./test.txt. Questa build con successo.

Il Docker documentation ha il seguente caso d'uso di esempio per l'istruzione COPY che è simile a quello che sto cercando di fare:

COPY hom?.txt /mydir/ 

Chiunque può segnalare quello che sto facendo male? Come posso fare per copiare un singolo file?

risposta

14

As stated in the Dockerfile documentation:

  • Se <src> è un qualsiasi altro tipo di file, esso viene copiato singolarmente e i relativi metadati. In questo caso, se <dest> termina con una barra finale /, verrà considerata una directory e il contenuto di <src> verrà scritto a <dest>/base(<src>).

  • Se <dest> non termina con una barra finale, esso sarà considerato un file normale e il contenuto di <src> sarà scritto a <dest>.

Quindi, si deve scrivere COPY test.txt /usr/src/app/ con un trailing /.

+0

Grazie jwodder, ha funzionato subito. –

Problemi correlati