2014-04-25 68 views
6

在容器啓動時,在Dockerfile中使用多個RUN命令來設置映像與單個CMD指令執行腳本的最佳做法是什麼?多個運行指令與單個CMD在Dockerfile中執行安裝腳本初始化容器

例如:

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"] 

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"] 

回答

5

第一個例子將是運行app多次更好。如果您要使用ENTRYPOINT而不是CMD,那麼您可以使容器的行爲如同它是app(因爲它將運行app以及在命令行中作爲參數傳入的任何內容)。如果您之後想要將此圖片用作其他圖片的基礎,則仍然可以訪問app

第二個示例運行速度會比較慢,因爲每次您必須提取zip文件docker run,並且如果您將此作爲父映像,則不能使用app,因爲app尚未安裝。

在一般情況下,我會建議使用第一種格式,但第二個是適用於微不足道的拉鍊和一次性使用的圖像和容器。

+0

謝謝!我沒有考慮到每次從圖像啓動容器時都會運行setup.sh的事實。就我而言,「app」最好是圖片的一部分,而不是每次都提取。 – Owen

+0

@Owen這就是'CMD'的用途: https://docs.docker.com/engine/reference/builder/#cmd –

相關問題