docker - 人们是否有理由将所有内容都写入 DockerFile 而不是单独的 shell 脚本?
问题描述
我不知何故不喜欢RUN x && y && z ...
我们目前在 DockerFile 中使用的语法。据我了解,我可以只运行一个 shell 脚本,而不是喜欢RUN xyz.sh
用我最喜欢的语言执行相同的任务。后者有什么缺点吗?
解决方案
更新:
除了 David 关于复杂性的观点之外,我相信将所有内容都写入 Dockerfile 可以更容易地共享(从而为您创造幸存者偏差)。即在 DockerHub 上,大多数时候,您都有一个“Dockerfile”选项卡来快速了解如何构建映像。如果作者使用COPY
and RUN xyz.sh
,他/她将不得不将脚本托管在其他地方,否则单独的 Dockerfile 将变得毫无意义。
CMD
在运行时执行,即从图像创建容器时。RUN
是构建时间指令。所以问题实际上是为什么人们用RUN
而不是CMD
在运行时运行东西。(那你当然COPY script.sh /script.sh
可以RUN bash /script.sh
)
如果您执行诸如安装依赖项之类的操作,则可能会花费大量时间,在扩展服务的情况下,这将使自动扩展变得无用,因为它的速度不足以吸收峰值。
在构建时,
RUN
可以缓存,所以下次构建会快很多。因为 docker 文件系统的工作方式,从同一个镜像创建 10 个容器只比创建 1 个容器多占用一些空间。所以你可以通过在镜像中安装包来节省磁盘空间,而如果你在运行时安装它们,它们都会占用一部分磁盘空间。
推荐阅读
- sqlite - 我可以在同一语句中多次使用 better-sqlite.get() 或 better-sqlite.all() 中的单个参数吗
- python - 当提供一个 pandas Series 对象作为另一个 pandas Series 对象的索引时会发生什么?
- python-3.x - 如何根据相似的列名对 DataFrame 进行子集化
- angular - 子控件在父控件之前呈现
- javascript - 当我从 PostMan 发送图像文件时,NodeJS multer 出现错误(req.file 未定义)
- r - 将名称和时间拆分为新行
- python - Pygame 零 Flappy Bird 修改
- windows - 注册子键自动打开dwg文件
- laravel - GlobalVueStyles:不适用于 vue 组件中的全局 Sass
- php - 无法使用 PHP PDO 和 Docker 连接到 Postgres 数据库