为什么我们不在Dockerfile上使用 CMD apt update 而不是 RUN apt update
我们使用RUN apt update来更新图像,这是一次,但为什么我们不使用CMD apt update来更新我们创建的每个容器?? ? ?
正如您已经知道的那样,RUN
它旨在“在当前图像之上的新层中执行任何命令并提交结果”,并且CMD
旨在“在当前图像之上的新层中执行任何命令并提交结果”。RUN
构建时指令也是如此,而CMD
运行时指令也是如此。
这不是一个好主意有几个原因:
通常期望容器消耗尽可能少的资源,并且快速轻松地启动和关闭。如果我们每次想要运行一个容器时都更新一个容器的包,那么在一个糟糕的网络上,容器可能需要几分钟甚至几个小时才能开始运行它打算运行的任何进程。
开发新容器映像的过程的一部分是确保容器工作所需的包能够很好地协同工作。但是,如果每次容器在运行它的任何系统上运行时我们都升级所有包,那么最终有可能(如果不是不可避免的话)将发布一个包,它会给容器带来重大更改,这显然不理想。
现在可以通过删除默认存储库并将其替换为您自己的存储库来避免这种情况,您可以在其中审查每个软件包升级,一起测试它们并发布它们,但这可能比除非存储库是有意义的努力更大提供多个容器镜像。
许多容器镜像(例如Golang)将根据它们支持的 Golang 版本对它们的镜像进行版本控制;但是,当容器上的底层包发生变化时,您将如何开始对映像进行版本控制?
现在这不一定会破坏交易,但它可能会导致容器用户群之间的混淆,并最终削弱他们对容器的信任。
即使有据可查,大多数开发人员也不会期望这种类型的功能,并且当您的容器需要访问 Internet 时会导致开发问题。例如,在 K8s 环境中,网络可能非常严格,开发人员需要手动打开通往 Internet 的路由(或一组自定义存储库)。
此外,即使网络不是问题,如果您希望启动大量这些容器,您可能会因为升级包而阻塞网络并导致网络性能问题。
虽然听起来您可能没有开发一个旨在用作其他任何东西的基本图像的图像......但显然CMD
很可能会被基本图像覆盖。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句