2014-07-02 16 views
74

Nel mio Dockerfile devo:Docker: l'aggiunta di un file da una directory padre

ADD ../../myapp.war /opt/tomcat7/webapps/ 

Questo file esiste come ls ../../myapp.war mi restituisce il file corretto, ma quando eseguo sudo docker build -t myapp . c'ho:

Step 1 : ADD ../../myapp.war /opt/tomcat7/webapps/ 
2014/07/02 19:18:09 ../../myapp.war: no such file or directory 

Qualcuno sa perché e come farlo correttamente?

+1

alcune soluzioni http://superuser.com/questions/842642 –

risposta

71

Sfortunatamente, (per motivi pratici e di sicurezza, suppongo), se si desidera aggiungere/copiare contenuto locale, deve trovarsi sotto lo stesso percorso root dello Dockerfile.

Da the documentation:

Il <src> percorso deve essere all'interno del contesto della build; si non è possibile AGGIUNGERE ../qualcosa di/qualcosa, poiché il primo passaggio di una finestra mobile build consiste nell'inviare la directory di contesto (e le sottodirectory) al daemon del docker .

EDIT: ora c'è un'opzione (-f) per impostare il percorso del Dockerfile; può essere usato per ottenere quello che vuoi, vedi la risposta di @Boedy nel

+12

c'è una soluzione alternativa "pulita" per questo? Preferirei non ristrutturare tutto il mio elenco di progetti solo per adattarlo. –

+0

Come detto da @ Günter, c'è una soluzione qui http://superuser.com/a/842690/136024 ... è davvero "pulito"? Beh, almeno è una "soluzione" :) –

+1

Vedere la risposta migliore da @Boedy http://stackoverflow.com/a/34300129/2950621 – nmgeek

80

È possibile costruire la Dockerfile dalla directory padre:

docker build -t <some tag> -f <dir/dir/Dockerfile> . 
+0

Ha funzionato senza problemi;) –

+1

Grazie! Funziona bene su una casella locale, ma Docker Hub non riesce a creare l'immagine poiché tenta di farlo dalla sua stessa directory (tbh, proprio come ci si aspetterebbe normalmente). C'è un modo per fare lo stesso trucco in Docker Hub? –

+0

Non che io sappia. È possibile inserire l'immagine nel registro anziché utilizzare la generazione automatica. – Boedy

4

La soluzione per coloro che utilizzano il compositore è quello di utilizzare un volume punta alla cartella principale:

#docker-composer.yml 

foo: 
    build: foo 
    volumes: 
    - ./:/src/:ro 

Ma io sono abbastanza sicuro che si può fare giocando con volumes in Dockerfile.

+3

Non può. _Nota: la directory host è, per sua natura, dipendente dall'host. Per questo motivo, ** non è possibile montare una directory host da Dockerfile ** perché le immagini create dovrebbero essere portatili. Una directory host non sarebbe disponibile su tutti i potenziali host. https://docs.docker.com/engine/tutorials/dockervolumes/#mount-a-host-directory-as-a-data-volume –

2

Dato che -f ha causato un altro problema, ho sviluppato un'altra soluzione.

  • creare un'immagine di base nella cartella principale
  • Aggiunto i file necessari.
  • Utilizzato questa immagine come immagine di base per il progetto che in una cartella discendente.

La bandiera -f non risolto il mio problema perché la mia immagine onbuild cerca un file in una cartella e ho dovuto chiamare in questo modo:

-f foo/bar/Dockerfile foo/bar

invece di

-f foo/bar/Dockerfile .

Si noti inoltre che questa soluzione è valida solo in alcuni casi come -f flag

29

Con finestra mobile-Compose è possibile impostare la cartella di contesto:

#docker-compose.yml 
version: '3.3'  
services: 
     yourservice: 
     build: 
      context: ./ 
      dockerfile: ./docker/yourservice/Dockerfile 
Problemi correlati