在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"]
答案 0 :(得分:5)
第一个示例更适合多次运行app
。如果您使用ENTRYPOINT
而不是CMD
,那么您可以使容器的行为就像它是app
一样(因为它会运行app
包含您传入的任何内容命令行作为参数)。如果您以后想要将此图片用作其他图片的基础,您仍然可以访问app
。
第二个示例运行速度稍慢,因为它必须在每次docker run
时提取zip文件,如果您将其设为父图像,则无法轻松使用app
,因为app
还没有安装。
一般情况下,我建议使用第一种格式,但第二种格式适用于普通拉链和一次性图像和容器。