2014-11-24 16 views
14

Sulla base di un howto, ho creato una nuova immagine basata su una esistente.
ora non ho un Dockerfile e ci sono cose che accadono, quando il contenitore inizia
Non posso cambiare - è così che mi sembra.Come modificare un'immagine di finestra mobile che è stata creata da una esistente

C'è un modo per modificare le cose che sono state impostate nel Dockerfile dell'immagine di base che ho usato?

ad esempio: il contenitore esegue uno script bash all'avvio, voglio cambiarlo.

risposta

12

Per rispondere r il tuo q specifico: "il contenitore esegue uno script bash quando si avvia, voglio cambiare questo".Supponiamo che si desidera eseguire /script.sh (parte dell'immagine) al posto del difetto, è possibile creare un'istanza di un contenitore utilizzando:

docker run --entrypoint /script.sh repo/image 

Se script.sh non è parte dell'immagine e/o preferite non dover specificare esplicitamente ogni volta con --entrypoint come sopra, si può preparare un'immagine che contiene e gestisce il proprio script.sh:

  1. creare una directory vuota e copiare o creare script.sh in esso
  2. creare Dockerfile con i seguenti contenuti:

    FROM repo/image 
    ADD script.sh/
    ENTRYPOINT /script.sh 
    
  3. docker build -t="myimage" .

  4. docker run myimage

Note:

  • Quando si esegue il contenitore (fase 4), non è più necessario specificare --entrypoint dal lo abbiamo predefinito nel Dockerfile.
  • È davvero così semplice; non è necessario iscriversi a docker dock o qualsiasi cosa del genere (anche se è ovviamente consigliato in tempo ;-)
1

Basta creare un nuovo Dockerfile in una directory vuota. Avviare il Dockerfile con

FROM repo/image 

dove 'repo/image' è l'id dell'immagine che si sta utilizzando attualmente.

e aggiungi le tue personalizzazioni di seguito.

In questo modo si crea una nuova immagine basata su un'altra immagine.

In particolare, per modificare il comando eseguito all'avvio, inserire una riga CMD e/o ENTRYPOINT.

+1

questa procedura sostituisce il file docker dell'immagine di base o aggiunge semplicemente qualcosa, è qualcosa che io mancato qui ... thx! – michabbb

+0

Il file Docker contiene istruzioni per creare un'immagine. 'FROM xxx/yyy' in un Dockerfile inizia con l'immagine' xxx/yyy' e la personalizza ulteriormente. Penso che "replace" o "append" non si applichino davvero qui. –

+3

Per come ho capito, un 'Dockerfile' è molto simile a un' Makefile', una serie di istruzioni per costruire un'immagine. Se il tuo 'Dockerfile' include le istruzioni' ADD' o 'COPY' che hanno come target i file che sono già contenuti nell'immagine di base, i file di base vengono" sostituiti "(" sovrapposti "è probabilmente più accurato). – sxc731

2

Se l'avvio del contenitore con il comando non riesce, l'immagine di base ha probabilmente introdotto un ENTRYPOINT. Tutti i comandi specificati per docker run verranno aggiunti come opzioni al comando ENTRYPOINT. Pertanto, dato un ENTRYPOINT di ad es. /usr/bin/somescript,

docker run -d --name newguest -p 8080:80 mymod/httpd:v1 /usr/sbin/httpd -D FOREGROUND 

farà sì che il contenitore per eseguire

/usr/bin/somescript /usr/sbin/httpd -D FOREGROUND 

invece di

/usr/sbin/httpd -D FOREGROUND 

per sbarazzarsi del entrypoint, utilizzare l'opzione --entrypoint:

docker run --entrypoint "" -d --name newguest -p 8080:80 mymod/httpd:v1 /usr/sbin/httpd -D FOREGROUND 
Problemi correlati