多个运行指令与单个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议使用第一种格式,但第二个是适用于微不足道的拉链和一次性使用的图像和容器。