我某种程度上不喜欢我们当前在DockerFile中使用的RUN x && y && z ...
语法。据我了解,我可以运行诸如RUN xyz.sh
之类的shell脚本,并使用自己喜欢的语言执行相同的任务。后者有什么缺点吗?
答案 0 :(得分:8)
更新:
除了David关于复杂性的观点外,我相信将所有内容写入Dockerfile使得共享更加容易(从而为您创建了生存倾向)。在大多数时候,即在DockerHub上,您都有一个“ Dockerfile”选项卡,以快速了解映像的构建方式。如果作者使用COPY
和RUN xyz.sh
,则他/她将不得不在其他地方托管脚本,否则仅Dockerfile变得毫无意义。
CMD
在运行时执行,也就是说,从映像创建容器时。 RUN
是构建时间指令。因此,问题实际上是为什么人们在运行时使用RUN
而不是CMD
来运行事物。 (您当然可以先COPY script.sh /script.sh
再RUN bash /script.sh
)
如果您执行诸如安装依赖项之类的工作,则可能会花费大量时间,如果扩展您的服务,这将使自动扩展变得无用,因为它的速度不足以吸收峰值。
在构建时,RUN
可以被缓存,因此下次构建会快很多。
由于docker文件系统的工作方式,从同一映像创建10个容器仅比创建1个容器占用更多空间。因此,可以通过在映像中安装软件包来节省磁盘空间,而如果在运行时安装它们,它们将全部占用一部分磁盘空间。
答案 1 :(得分:1)
RUN在新层中执行命令并创建新映像。使用docker build构建映像时会发生这种情况。
CMD指定默认命令,以及从镜像启动容器时要运行的参数。
总结。运行和cmd不可互换,创建映像时运行RUN,启动容器时运行CMD。