2016-06-22 42 views
5

Ho uno script di shell, script.sh, che scrive alcune righe in un file:La scrittura di dati su file in Dockerfile

#!/usr/bin/env bash 
printf "blah 
blah 
blah 
blah\n" | sudo tee file.txt 

Ora nel mio Dockerfile, aggiungo questo script ed eseguirlo, quindi tentare di aggiungere il generato file.txt:

ADD script.sh . 
RUN chmod 755 script.sh && ./script.sh 
ADD file.txt . 

Quando faccio quanto sopra, ottengo solo un errore riferendosi al comando ADD file.txt .:

lstat file.txt: no such file or directory

Perché la finestra mobile non può individuare il file generato dallo script della shell? Dove potrei trovarlo?

risposta

4

Quando si RUN chmod 755 script.sh && ./script.sh effettivamente eseguire questo script all'interno del contenitore finestra mobile (vale a dire: nello strato finestra mobile).

Quando si ADD file.txt . si tenta di aggiungere un file sul locale file system all'interno del contenitore finestra mobile (ad esempio: in un nuovo livello finestra mobile).

Non puoi farlo perché il file.txt non esiste sul tuo computer.

In realtà si dispone già di questo file all'interno finestra mobile, prova a docker run --rm -ti mydockerimage cat file.txt e si dovrebbe vedere il suo contenuto visualizzato

+0

Sì, ho capito che dopo il fatto. – pcsram

1

È perché Docker carica l'intero contesto della directory (dove si trova il Dockerfile) al daemon Docker all'inizio. Da documenti Docker,

La compilazione viene eseguita dal daemon Docker, non dalla CLI. La prima cosa che fa un processo di compilazione è inviare l'intero contesto (in modo ricorsivo) al demone. Nella maggior parte dei casi, è meglio iniziare con una directory vuota come contesto e mantenere il Dockerfile in quella directory. Aggiungi solo i file necessari per creare il Dockerfile.

Poiché il file di testo non era disponibile all'inizio, viene visualizzato il messaggio di errore. Se desideri comunque che il file di testo venga aggiunto all'immagine Docker, puoi chiamare il comando `docker build 'dallo stesso file di script. Modifica script.sh,

#!/usr/bin/env bash 
printf "blah 
blah 
blah 
blah\n" | sudo tee <docker-file-directory>/file.txt 
docker build --tag yourtag <docker-file-directory> 

E modificare il Dockerfile solo per aggiungere il file di testo generato.

ADD file.txt 
.. <rest of the Dockerfile instructions> 
+1

penso che il file in output può effettivamente essere a immagine strato di Docker stessa. Penso che sia così perché ho rimosso la riga 'ADD file.txt' e l'ho sostituita con' CMD ["cat", "file.txt"] '. Sono stato in grado di costruire l'immagine ed eseguire correttamente il contenitore, visualizzando "blah blah bla .." – pcsram