2014-04-25 42 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 –

相关问题