为什么我们不在 Dockerfile 上使用 CMD apt update 而不是 RUN apt update?

艾哈迈德·阿卜杜勒·拉苏尔

为什么我们不在Dockerfile上使用 CMD apt update 而不是 RUN apt update

我们使用RUN apt update来更新图像,这是一次,但为什么我们不使用CMD apt update来更新我们创建的每个容器?? ? ?

约什马兰达

正如您已经知道的那样,RUN它旨在“在当前图像之上的新层中执行任何命令并提交结果”,并且CMD旨在“在当前图像之上的新层中执行任何命令并提交结果”。RUN构建时指令也是如此,而CMD运行时指令也是如此。

这不是一个好主意有几个原因:

  1. 容器应该很快

通常期望容器消耗尽可能少的资源,并且快速轻松地启动和关闭。如果我们每次想要运行一个容器时都更新一个容器的包那么在一个糟糕的网络上,容器可能需要几分钟甚至几个小时才能开始运行它打算运行的任何进程。

  1. 意外行为

开发新容器映像的过程的一部分是确保容器工作所需的包能够很好地协同工作。但是,如果每次容器在运行它的任何系统上运行时我们都升级所有包,那么最终有可能(如果不是不可避免的话)将发布一个包,它会给容器带来重大更改,这显然不理想。

现在可以通过删除默认存储库并将其替换为您自己的存储库来避免这种情况,您可以在其中审查每个软件包升级,一起测试它们并发布它们,但这可能比除非存储库是有意义的努力更大提供多个容器镜像。

  1. 图像版本控制

许多容器镜像(例如Golang)将根据它们支持的 Golang 版本对它们的镜像进行版本控制;但是,当容器上的底层包发生变化时,您将如何开始对映像进行版本控制?

现在这不一定会破坏交易,但它可能会导致容器用户群之间的混淆,并最终削弱他们对容器的信任。

  1. 意外的网络流量

即使有据可查,大多数开发人员也不会期望这种类型的功能,并且当您的容器需要访问 Internet 时会导致开发问题。例如,在 K8s 环境中,网络可能非常严格,开发人员需要手动打开通往 Internet 的路由(或一组自定义存储库)。

此外,即使网络不是问题,如果您希望启动大量这些容器,您可能会因为升级包而阻塞网络并导致网络性能问题。

  1. 不适用于基本图像

虽然听起来您可能没有开发一个旨在用作其他任何东西的基本图像的图像......但显然CMD很可能会被基本图像覆盖。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Dockerfile中临时缓存RUN apt-get update && apt-get install

构建具有“ RUN apt-get update”的Dockerfile,使我“在rootfs内引起的“拒绝渗透”的jail进程”

在Debian Linux上`apt update`失败

在 Raspbian 上使用 apt-get update 时的警告

一些软件包被Ubuntu软件中心列为更新,但不是`sudo apt update`。为什么?

什么时候以及为什么应该使用apt-get update?

为什么使用“ sudo apt-get update”会收到错误消息?

为什么不通过apt install自动运行apt update?

在支持的版本上找不到 404 运行 apt update 结果

我尝试在我的 linux 上运行命令“sudo apt update”并显示错误

上一次运行update-apt-xapian-index是什么时候?

每当我们安装任何东西时,是否都必须使用“ sudo apt-get update”命令每次进行更新吗?

alias updt='sudo apt update -y && sudo apt full-upgrade -y && sudo apt autoremove -y' ... 会出什么问题?

防止“ apt-file”使用每个“ apt update”更新其数据库

使用sudo aptitude / apt-get update不起作用

无法使用 apt-get update 更新 ubuntu Docker 容器

何时运行“sudo apt update”,何时运行“sudo apt update && sudo apt upgrade”?

为什么我们应该避免在Ubuntu上使用apt-get安装Node.js?

异步弄乱了apt,而我却无法apt-get update / upgrade

“apt-get update”和“apt-get-upgrade”的 snap 等效项是什么?

apt-get update说我没有权限

当我运行sudo apt-get update时出错

在“ apt update”的输出中,“ InRelease”和“ Release”指的是什么?

“sudo apt-get update”有什么作用?

你什么时候运行“apt-get update?”

为什么使用apt.Cache而不是apt.cache.Cache()创建对象

我应该多久使用一次apt-get update进行更新?

为什么我使用 Dockerfile 制作新镜像,但是 apt-get 错误?

当apt不接受存储库时,如何apt-update?