为什么我们不在 Dockerfile 上使用 CMD apt update 而不是 运行 apt update?
why we don't use CMD apt update instead of RUN apt update on Dockerfile?
为什么我们不在 Dockerfile
上使用 CMD apt update 而不是 运行 apt update
我们使用 运行 apt update 来更新图像这是一次性的,但为什么我们不使用 CMD apt update 用于更新我们创建的每个容器? ? ? ?
听起来您已经知道,RUN
旨在“在当前图像之上的新层中执行任何命令并提交结果”,CMD
旨在“在当前图像之上的新层中执行任何命令并提交结果”。所以 RUN
是 build-time 指令,而 CMD
是 run-time 指令。
这不是一个好主意有几个原因:
- 容器应该很快
容器通常被期望消耗尽可能少的资源,并且启动和关闭又快又容易。如果我们 每次 更新一个容器的包,我们想要 运行 一个容器,它可能需要几分钟甚至几个小时在一个糟糕的网络上才能启动 运行宁任何它打算用于的过程。
- 意外行为
开发新容器映像的部分过程是确保容器工作所需的包能够很好地协同工作。但是,如果我们每次在容器 运行 上 运行 上的任何系统上升级所有包,则有可能(如果不是不可避免的话)最终会发布一个包对容器引入了一个破坏性的变化,这显然是不理想的。
现在可以通过删除默认存储库并用您自己的存储库替换它们来避免这种情况,您可以在其中审查每个包升级,一起测试它们,然后发布它们,但这是除非 repos 将提供多个容器镜像,否则可能比有意义的努力要大得多。
- 图像版本控制
许多容器镜像(例如 Golang)将根据它们支持的 Golang 版本对它们的镜像进行版本控制;但是,当容器上的底层包发生变化时,您将如何开始对映像进行版本控制?
现在这不一定会破坏交易,但它可能会导致容器之间的混淆 user-base 并最终削弱他们对容器的信任。
- 意外的网络流量
即使有很好的文档记录,大多数开发人员也不会期望这种类型的功能,并且当您的容器需要访问 Internet 时会导致开发问题。例如,在 K8s 环境中,网络可能非常严格,开发人员需要手动打开一个到 Internet 的路由(或一组自定义 repos)。
此外,即使网络不是问题,如果您希望启动大量此类容器,您也可能会因升级包而阻塞网络并导致网络性能问题。
- 不适用于基本图像
虽然听起来您可能没有开发旨在用作其他任何东西的基础图像的图像......但显然 CMD
可能会被基础图像覆盖。
为什么我们不在 Dockerfile
上使用 CMD apt update 而不是 运行 apt update我们使用 运行 apt update 来更新图像这是一次性的,但为什么我们不使用 CMD apt update 用于更新我们创建的每个容器? ? ? ?
听起来您已经知道,RUN
旨在“在当前图像之上的新层中执行任何命令并提交结果”,CMD
旨在“在当前图像之上的新层中执行任何命令并提交结果”。所以 RUN
是 build-time 指令,而 CMD
是 run-time 指令。
这不是一个好主意有几个原因:
- 容器应该很快
容器通常被期望消耗尽可能少的资源,并且启动和关闭又快又容易。如果我们 每次 更新一个容器的包,我们想要 运行 一个容器,它可能需要几分钟甚至几个小时在一个糟糕的网络上才能启动 运行宁任何它打算用于的过程。
- 意外行为
开发新容器映像的部分过程是确保容器工作所需的包能够很好地协同工作。但是,如果我们每次在容器 运行 上 运行 上的任何系统上升级所有包,则有可能(如果不是不可避免的话)最终会发布一个包对容器引入了一个破坏性的变化,这显然是不理想的。
现在可以通过删除默认存储库并用您自己的存储库替换它们来避免这种情况,您可以在其中审查每个包升级,一起测试它们,然后发布它们,但这是除非 repos 将提供多个容器镜像,否则可能比有意义的努力要大得多。
- 图像版本控制
许多容器镜像(例如 Golang)将根据它们支持的 Golang 版本对它们的镜像进行版本控制;但是,当容器上的底层包发生变化时,您将如何开始对映像进行版本控制?
现在这不一定会破坏交易,但它可能会导致容器之间的混淆 user-base 并最终削弱他们对容器的信任。
- 意外的网络流量
即使有很好的文档记录,大多数开发人员也不会期望这种类型的功能,并且当您的容器需要访问 Internet 时会导致开发问题。例如,在 K8s 环境中,网络可能非常严格,开发人员需要手动打开一个到 Internet 的路由(或一组自定义 repos)。
此外,即使网络不是问题,如果您希望启动大量此类容器,您也可能会因升级包而阻塞网络并导致网络性能问题。
- 不适用于基本图像
虽然听起来您可能没有开发旨在用作其他任何东西的基础图像的图像......但显然 CMD
可能会被基础图像覆盖。