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

时间:2014-04-25 17:20:25

标签: docker

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

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

1 个答案:

答案 0 :(得分:5)

第一个示例更适合多次运行app。如果您使用ENTRYPOINT而不是CMD,那么您可以使容器的行为就像它是app一样(因为它会运行app包含您传入的任何内容命令行作为参数)。如果您以后想要将此图片用作其他图片的基础,您仍然可以访问app

第二个示例运行速度稍慢,因为它必须在每次docker run时提取zip文件,如果您将其设为父图像,则无法轻松使用app,因为app还没有安装。

一般情况下,我建议使用第一种格式,但第二种格式适用于普通拉链和一次性图像和容器。