Docker: aggiunta di un file da una directory padre


186

Nel mio Dockerfileho:

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

Quel file esiste come ls ../../myapp.warmi restituisce il file corretto ma quando eseguo sudo docker build -t myapp .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?


2
Alcune soluzioni alternative superuser.com/questions/842642
Günter Zöchbauer

Risposte:


225

È possibile creare il Dockerfile dalla directory principale:

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

3
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 quello che ci si aspetterebbe normalmente). C'è un modo per fare lo stesso trucco in Docker Hub?
Marcel Hernandez,

Non che io sappia. È possibile inviare l'immagine al registro invece di utilizzare la compilazione automatizzata.
Boedy,

2
@ eduncan911 Non penso che questo sia deprecato al momento in cui sto scrivendo il mio commento. Potrebbero aver cambiato idea da allora? Se sbaglio, puoi collegarti alla documentazione in cui dice che è deprecato. Grazie!
omninonsense,

6
-f non sembra essere deprecato per i documenti -> Specifica un file Docker (-f) : docs.docker.com/engine/reference/commandline/build/…
Ray

6
@ eduncan911 puoi eliminare il tuo commento poiché apparentemente non è deprecato? Inizialmente ho ignorato questa risposta a causa del tuo commento.
Chris Anderson,

103

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

Dalla documentazione :

Il percorso <src> deve essere all'interno del contesto della build; non puoi AGGIUNGERE ../something / qualcosa, perché il primo passo di una build docker è inviare la directory di contesto (e le sottodirectory) al demone docker.

EDIT: ora c'è un'opzione ( -f) per impostare il percorso del tuo Dockerfile; può essere utilizzato per ottenere ciò che desideri, vedi la risposta di @Boedy nel seguito.


22
Esiste una soluzione "pulita" per questo? Preferirei non ristrutturare l'intera directory del mio progetto solo per adattarlo.
ben_frankly

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

2
Vedere meglio risposta da @Boedy stackoverflow.com/a/34300129/2950621
nmgeek

103

Con docker-compose è possibile impostare la cartella di contesto:

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

9

Aggiunta di alcuni frammenti di codice per supportare la risposta accettata.

Struttura di directory:

setup/
 |__docker/DockerFile
 |__target/scripts/<myscripts.sh>
src/
 |__<my source files>

Voce del file Docker:

RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/scripts/
RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/src/
WORKDIR /home/vagrant/dockerws/chatServerInstaller

#Copy all the required files from host's file system to the container file system.
COPY setup/target/scripts/install_x.sh scripts/
COPY setup/target/scripts/install_y.sh scripts/
COPY src/ src/

Comando utilizzato per creare l'immagine della finestra mobile

docker build -t test:latest -f setup/docker/Dockerfile .

ottimo approccio. È possibile condividere anche il codice di install_x.sh?
Ariful Haque,

4

La soluzione per coloro che usano il compositore è usare un volume che punta alla cartella principale:

#docker-composer.yml

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

Ma sono abbastanza sicuro che si possa fare giocando con i volumi 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 devono essere portatili. Una directory host non sarebbe disponibile su tutti i potenziali host. docs.docker.com/engine/tutorials/dockervolumes/…
Peeter Kokk

4

Da quando ha -fcausato un altro problema, ho sviluppato un'altra soluzione.

  • Crea un'immagine di base nella cartella principale
  • Aggiunti i file richiesti.
  • Utilizzata questa immagine come immagine di base per il progetto che si trova in una cartella discendente.

Il -fflag non ha risolto il mio problema perché la mia onbuildimmagine cerca un file in una cartella e ha dovuto chiamare così:

-f foo/bar/Dockerfile foo/bar

invece di

-f foo/bar/Dockerfile .

Si noti inoltre che questa è solo una soluzione per alcuni casi come -fflag

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.