多个运行指令与单个CMD在Dockerfile中执行安装脚本来初始化容器

在容器启动时,在Dockerfile中使用多个RUN命令来设置图像与单个CMD指令来执行脚本的最佳做法是什么?

例如:

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

第一个例子会更好地运行app多次。 如果你要使用ENTRYPOINT而不是CMD那么你可以使容器的行为就像它是app (因为它会运行app与你在命令行上传递的任何东西作为参数)。 如果您之后想要将此图片用作其他图片的基础,则仍然可以访问app

第二个示例运行速度稍慢,因为每次docker run时都必须提取zip文件,如果将其设置为父映像,则无法轻松使用app ,因为app尚未安装。

一般来说,我会build议使用第一种格式,但第二个是适用于微不足道的拉链和一次性使用的图像和容器。