【问题标题】:How do you install something that needs restart in a Dockerfile?如何在 Dockerfile 中安装需要重启的东西?
【发布时间】:2017-02-04 08:37:19
【问题描述】:

假设我有如下安装说明:

  1. 做点什么。
  2. 重新启动您的计算机。
  3. 做点别的。

如何在 Dockerfile 中表达这一点?

【问题讨论】:

  • 您不需要重新启动,因为它会在您启动 docker 容器时进行干净启动。你能解释一下为什么需要重启吗?
  • 所以每次在dockerfile中调用“RUN”,是不是好像“机器”刚刚重启?
  • 除非你保存 docker 容器的状态。它构建后是干净启动,然后您可以每次从干净状态启动它,也可以增量保存状态。

标签: docker dockerfile


【解决方案1】:

这完全取决于他们为什么需要重新启动。对于 Linux,重新启动机器通常表示内核修改,尽管它可能是为了更简单的事情,例如用户权限的更改(这将通过注销并重新登录来处理)。如果安装尝试对内核进行操作系统级别的更改,那么如果在容器内完成,它应该会失败。默认情况下,容器隔离并限制应用程序可以对正在运行的主机操作系统执行的操作,这些操作会影响主机或其他正在运行的容器。

如果重新启动是为了强制应用服务重新启动,您应该意识到这种设计不能很好地映射到容器,因为每个 RUN 命令都只在隔离环境中运行该命令。并且通过仅运行该命令,这也表明通常在操作系统启动时启动的任何操作系统服务(cron、sendmail 或您的应用程序)都不会在容器中启动。因此,除了重新启动任何依赖服务之外,您还需要找到一种方法来运行安装命令。

我能想到的最后一个场景是他们希望不同的用户权限对登录用户生效。在这种情况下,下一个 RUN 命令将使用先前 RUN 命令更改的访问权限运行所请求的命令。因此,您无需自行采取任何特定操作来重新启动,只需执行安装步骤,就好像每个步骤之间有完全重新启动一样。

【讨论】:

  • 你可以运行一个命令,提交层,然后如果你想通过在镜像中运行新的命令来重新开始。
  • 使用 Dockerfile 来构建您的映像,这正是每条 RUN 行所发生的事情。 Dockerfile 只是使结果易于重现。使用提交步骤手动构建映像类似于在 cli 上运行 50 个命令而不是编写 shell 脚本,最终你会弄乱列表中的一个命令并且不知道发生了什么问题。
猜你喜欢
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 2020-02-03
  • 2017-06-26
  • 1970-01-01
  • 2018-07-01
相关资源
最近更新 更多