人们为什么将所有内容都写入DockerFile而不是单独的shell脚本,这是有原因的吗?

时间:2019-01-05 13:45:25

标签: docker dockerfile

我某种程度上不喜欢我们当前在DockerFile中使用的RUN x && y && z ...语法。据我了解,我可以运行诸如RUN xyz.sh之类的shell脚本,并使用自己喜欢的语言执行相同的任务。后者有什么缺点吗?

2 个答案:

答案 0 :(得分:8)

更新:

除了David关于复杂性的观点外,我相信将所有内容写入Dockerfile使得共享更加容易(从而为您创建了生存倾向)。在大多数时候,即在DockerHub上,您都有一个“ Dockerfile”选项卡,以快速了解映像的构建方式。如果作者使用COPYRUN xyz.sh,则他/她将不得不在其他地方托管脚本,否则仅Dockerfile变得毫无意义。


CMD在运行时执行,也就是说,从映像创建容器时。 RUN是构建时间指令。因此,问题实际上是为什么人们在运行时使用RUN而不是CMD来运行事物。 (您当然可以先COPY script.sh /script.shRUN bash /script.sh

  1. 如果您执行诸如安装依赖项之类的工作,则可能会花费大量时间,如果扩展您的服务,这将使自动扩展变得无用,因为它的速度不足以吸收峰值。

  2. 在构建时,RUN可以被缓存,因此下次构建会快很多。

  3. 由于docker文件系统的工作方式,从同一映像创建10个容器仅比创建1个容器占用更多空间。因此,可以通过在映像中安装软件包来节省磁盘空间,而如果在运行时安装它们,它们将全部占用一部分磁盘空间。

答案 1 :(得分:1)

RUN在新层中执行命令并创建新映像。使用docker build构建映像时会发生这种情况。

CMD指定默认命令,以及从镜像启动容器时要运行的参数。

总结。运行和cmd不可互换,创建映像时运行RUN,启动容器时运行CMD。