2014-09-24 18 views
5

Voglio sfruttare il caching/layering delle immagini docker per risparmiare larghezza di banda, spazio su disco e tempo trascorso.Aggiornamento immagini docker con piccole modifiche utilizzando commit

diciamo:

  • Ho un'immagine finestra mobile di un web-app installato e implementato in diversi host della finestra mobile.
  • L'immagine della finestra mobile contiene il codice sorgente della mia app Web.
  • Ho lavorato al codice e ora ho una nuova versione del codice.

Come dovrei automatizzare la creazione di una nuova finestra mobile commettere ultima immagine sopra contenente solo il bugfix?

Il mio obiettivo è che per scaricare le nuove immagini per gli host di docker che hanno già scaricato l'immagine precedente sarà richiesta solo la piccola correzione del bug.

Questa è la sate della mia riflessione in corso su di esso:

  • probabilmente finirò con docker commit in qualche modo per salvare aggiornamento nell'immagine.
  • Ma come posso accedere al contenuto dell'immagine?
  • E anche allora, come posso importare le mie modifiche senza ingombrare le immagini originali della finestra mobile con vari strumenti (git e script di shell) che non hanno nulla a che fare con il servizio dell'app Web ?.
  • Ho esaminato i volumi per condividere il codice con un'altra finestra mobile che avrebbe curato l'aggiornamento. Ma i volumi non vengono commessi.

Grazie per qualsiasi suggerimento su come ottenere questo!

MODIFICA: l'utilizzo di più file Docker sembra un altro modo per eseguire questa operazione, ovvero http://jpetazzo.github.io/2013/12/01/docker-python-pip-requirements/ per problemi simili. Sembra che avrò bisogno di generare i miei dockerfiles al volo.

+0

Come si aggiunge il codice all'immagine? – Behe

+0

@Behe Non capisco la tua domanda perché ho affermato che fa parte del mio problema. Se la tua domanda riguarda l'aggiunta del codice in primo luogo (prima di aggiornare l'app), beh stavo pensando di usare ADD in build automatizzati come in http://dockerfile.github.io/#/python-runtime. – vaab

+0

Se si utilizza un Dockerfile e si inserisce il comando ADD alla fine, si dovrebbe colpire la cache fino a quando il contenuto modificato viene aggiunto e quindi creare un nuovo livello per il nuovo contenuto. Ti sembra utile? – Behe

risposta

2

Ecco come aggiornare un'immagine esistente con docker commit.

  1. lancio un contenitore con l'immagine che si desidera modificare:

    docker run -t -i IMAGE /bin/bash 
    

    Nota che probabilmente si vorrà accedere ad alcune file host/directory per importare cambiamenti nel contenitore:

    docker run -t -i -v /host/location:/mnt/share IMAGE /bin/bash 
    

    Quindi uscire con Ctrl-D o exit.

    Se si desidera automatizzare questo in uno script, è necessario ottenere l'id contenitore per il passaggio successivo.E ti consigliamo di eseguire i comandi direttamente invece di chiamare una sessione interattiva di bash:

    container_id=$(docker run -d -v /host/location:/mnt/share IMAGE /bin/bash -c " 
         ## any bash code 
         rsync -av --delete --exclude .git /mnt/share /my/app/ 
         cd /my/app 
         ./autogen.sh 
        ") 
    
  2. Commit vostro file system contenitore modificato come nuova immagine:

    docker commit CONTAINER_ID IMAGE_NAME 
    

    Nota: si può desiderare di usa lo stesso IMAGE_NAME di quello che hai lanciato per la prima volta con il contenitore . Questo aggiornerà in modo efficace la tua immagine.

preoccupazioni supplementari:

  • Qualsiasi modifica effettuata su una precedente immagine dovrebbe cercare di ridurre al minimo il nuovo livello creato ultima immagine su. Le regole dipendono probabilmente se si utilizza BTRFS (le modifiche a livello di blocco saranno effettivamente nel 'livello') o AUFS (modifiche a livello di file). La cosa migliore sarebbe evitare di sostituire interi file sorgenti con gli stessi file (evitare cp -a, git checkout-index, favorire rsync o git checkout).

  • Avrete bisogno di installare alcuni strumenti sul vostro VM in modo da poter fare gli aggiornamenti (probabilmente git, rsync ...). Ma non dimenticare che potresti anche fornire script (o anche strumenti completi), grazie al volume host montato.

  • L'immagine creata non è ortodossa e non proviene da un Dockerfile. Probabilmente dovresti ricostruire un'immagine completamente nuova abbastanza regolarmente da uno Dockerfile ufficiale. O almeno cercare di ridurre al minimo la stratificazione avendo tutte le immagini basate direttamente su un'immagine ufficiale.

Problemi correlati