2016-03-12 9 views
6

Ho un Dockerfile (https://gist.github.com/hasMobi/e198555704ee57e84399) che hanno questi due comandi in sequenza:Dockerfile - la rimozione di un file in un comando RUN, è ancora presente nel prossimo comando RUN

RUN rm -frv /usr/share/nginx/html/* 
RUN ls /usr/share/nginx/html/ 

Quando guardo la console mentre immagine hte costruzione, posso chiaramente vedere 2 file che vengono rimossi da quella cartella, ma quando il comando successivo RUN viene, elenca il contenuto della directory ei file sono ancora lì ?:

enter image description here

cosa sta succedendo qui? Capisco che ogni comando RUN crea un layer separato e uno è isolato dall'altro, ma non è il secondo comando RUN che dovrebbe ereditare il file system nello stato esatto in cui si trovava nel precedente comando RUN (con i 2 file mancanti)?

+0

Se si dovesse modificare la riga 12 del file docker in modo che sia: 'RUN rm -frv/usr/share/nginx/html/* && ls/usr/share/nginx/html /', quale output si ottiene? Sto solo cercando di isolare se il problema riguarda il tuo comando, o se è con i livelli dell'immagine che non si creano correttamente l'uno sull'altro – CtheGood

+1

ho riscontrato lo stesso problema e alla fine ho capito che i file che stavo cercando di rimuovere erano definiti come all'interno di un volume dall'immagine di base Dockerfile, quindi il volume veniva ricreato in ogni livello. Dalla [documentazione Docker] (https://docs.docker.com/engine/reference/builder/#volume): 'Se qualche passo di costruzione modifica i dati all'interno del volume dopo che è stato dichiarato, tali modifiche saranno scartato. –

risposta

1

Fondamentalmente, i comandi ADD dall'immagine di base sovrascrivono i comandi RUN nel Dockerfile. Vedere this per ulteriori informazioni.

Nota: la prima istruzione ADD rilevata invaliderà la cache per tutte le seguenti istruzioni dal file Docker se il contenuto di è stato modificato. Ciò include l'invalidazione della cache per le istruzioni RUN. Per ulteriori informazioni, consultare la guida Best Practices di Dockerfile.

Si può considerare biforcarsi sull'immagine di base di origine e utilizzare invece la versione personalizzata.

+0

Dockerfile: https://gist.github.com/hasMobi/e198555704ee57e84399 Risultato: http://prntscr.com/aeng43 All'interno della stessa cartella del 'Dockerfile' I l'unico altro file presente è/code/index.html, con all'interno un testo "Hello world". Il mio obiettivo finale è avere solo questo file presente in/usr/share/nginx/html/'. Ma index.php sembra essere ripristinato all'interno della cartella 'html' con ogni comando RUN. –

+0

A proposito, sto usando Docker v1.10.3 su Windows. –

+0

Se dovessi provare a cambiare la riga 12 come: 'RUN rm -frv/usr/share/nginx/html/* && ls/usr/share/nginx/html /', quale output ottieni? Sto solo cercando di isolare se il problema riguarda il tuo comando, o se è con i livelli dell'immagine che non si creano correttamente l'uno sopra l'altro. – CtheGood

1

ho avuto un problema simile:

RUN rm -rf /full/path 
    RUN ln -s /other /full/path 

Questo fallisce perché "/ full/percorso" esiste ancora sul secondo RUN. Questa soluzione funziona:

RUN rm -rf /full/path; ln -s /other /full/path 

Non capisco il comportamento ma è stato in grado di aggirare il problema nel mio caso.

Problemi correlati