2014-04-25 10 views
6

Qual è la migliore procedura per utilizzare molti comandi RUN in un Dockerfile per configurare l'immagine rispetto a una singola istruzione CMD per eseguire uno script all'avvio del contenitore ?Istruzioni RUN multiple e singola CMD per eseguire lo script di installazione in Dockerfile per inizializzare il contenitore

Ad esempio:

FROM centos:latest 

RUN useradd myuser 
RUN mkdir -p /usr/local/myapp 
ADD ./resources/myapp.zip /usr/local/myapp 
RUN unzip /usr/local/myapp/myapp.zip 
RUN chown -R myuser:myuser /usr/local/myapp 

CMD ["/usr/local/myapp/bin/app"] 

vs.

FROM centos:latest 

ADD ./resources/myapp.zip/
ADD ./resources/setup.sh/
RUN chmod +x /setup.sh 

# setup.sh will create the user, extract the zip, execute the binary 
CMD ["/setup.sh"] 

risposta

5

Il primo esempio sarà meglio per l'esecuzione app più volte. Se si dovesse usare ENTRYPOINT invece di CMD, si potrebbe fare in modo che il contenitore si comporti come se fosse app (perché eseguirebbe app con qualsiasi cosa si passasse nella riga di comando come argomenti). Se in seguito si desidera utilizzare questa immagine come base per un'altra immagine, è comunque possibile accedere a app.

Il secondo esempio verrà eseguito un po 'più lento in quanto deve estrarre il file zip ogni volta che si docker run e non è possibile utilizzare app facilmente se si effettua questa immagine di un genitore, in quanto app non è stato installato.

In generale, suggerirei di utilizzare il primo formato, ma il secondo va bene per le cerniere banali e le immagini e i contenitori usa e getta.

+0

Grazie! Non avevo considerato il fatto che setup.sh sarebbe stato eseguito ogni volta che avvii un contenitore dall'immagine. Nel mio caso, sarebbe meglio che 'app' fosse parte dell'immagine piuttosto che estratta ogni volta. – Owen

+0

@Owen Questo è lo scopo di 'CMD': https://docs.docker.com/engine/reference/builder/#cmd –

Problemi correlati