【问题标题】:Docker force usage of volumeDocker 强制使用卷
【发布时间】:2021-03-29 09:04:52
【问题描述】:

我知道您可以在 dockerfile 中指定一个卷,但我发现用户不需要创建这样一个卷的问题。

如果他忘记指定一个卷,并且那里保存了许多可能很昂贵的文件,但它们不是持久的,因为没有指定卷怎么办?

所以我的问题是是否可以强制用户为该挂载点创建一个卷,或者至少在开始时(在容器内)检查是否有一个卷已挂载,以便它可以对丢失的内容做出反应音量?

编辑:有了自动创建的未命名卷的新信息,我也将接受用户端解决方案(不以检查卷的方式更改容器,而是警告/防止的 docker-deamon 设置我不会错误地创建未命名的卷。

【问题讨论】:

  • 如果您的Dockerfile 有一个VOLUME 指令并且在运行期间没有挂载命名卷,那么docker 将为数据创建一个anonymous volume,该卷永远不会“丢失”。您可以检查容器装载的卷名称docker inspect mycontainer --format "{{range .Mounts}}{{.Name}}{{end}}"
  • 哦,我仍然希望能回答我的问题,因为我认为这些 id-names 卷不适合存放重要数据。
  • 如果您发现自己使用匿名卷,您可以将数据移动到命名卷,然后使用命名卷重新创建容器。
  • @masseyb 这是我知道的部分,但我要求的是一个能抓住用法的功能。

标签: docker docker-volume


【解决方案1】:

我认为VOLUME 声明是你可以在这里做的最好的。

一般来说,容器不能强制自己使用任何特定选项运行。您可以提出类似的论点,即容器“必须”使用已发布的端口或附加的标准输入来运行才能有用,但 Docker 不允许映像强制使用这些端口。 (更重要的是,图像不需要直接访问主机文件系统、主机网络或特权模式。)

正如@masseyb 在评论中指出的那样,Dockerfile VOLUME 指令的关键作用是在给定目录上创建一个新的匿名卷,如果那里没有挂载其他任何东西。 docker volume ls 将显示它,您应该可以直接在 docker run -v 选项中使用卷 ID,因此您实际上不会在这里丢失数据。 (令人惊讶的是,似乎没有命令为卷命名。)

原则上,可以在入口点包装脚本中检查一些内容,但这不适用于此卷案例。容器无法判断目录是自动创建的匿名卷还是新的空命名卷。

(还请记住,卷,包括自动创建的匿名卷,永远不会提交给图像。在您的 Dockerfile 中,您将目录内容声明为 VOLUME 后,您将无法更改它;如果最终用户尝试使用 @987654326 @ 派生图像,它不会包含体积数据。除非您确定这是您想要的,否则我通常建议您不要声明 VOLUME。您在问题中描述的情况几乎是一种有用的情况。)

【讨论】:

  • 你说得对,问题比我想象的要大。端口也会出现同样的问题,您可以将其公开,但它不会做任何事情。用户不会记住端口/卷很重要。对于端口,至少有一个选项可以将所有端口公开给一些任意端口。
猜你喜欢
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多