【问题标题】:Using mount command while Docker build在 Docker 构建时使用 mount 命令
【发布时间】:2020-12-10 10:59:52
【问题描述】:

所以这不是要为-v寻找解决方法。

我有一个 Dockerfile,其目的是在容器 inside/usr/local/<cross-compiler-path> 中安装一个交叉编译器。稍后在构建过程中,文件将被挂载到此交叉编译器,如下所示:

root@5bee5daf8165:/# mount <blah.img.gz> /usr/local/<cross-compiler-path>

我收到mount: /usr/local/<cross-compiler-path>: mount failed: Operation not permitted.

虽然如果我跳过这一步,完成构建,运行--privileged 容器并挂载,它工作正常。

我理解在构建中不提供特权模式的原因,因为它破坏了容器的“可移植性”,因为它们依赖于主机卷。但就我而言,我试图将它安装在容器自己的文件系统中。为什么不允许这样做?

为了记录,我尝试在不同的路径上安装交叉编译器,如下所示:

root@5bee5daf8165:/# mount <blah.img.gz> /home/<cross-compiler-path>

但这也不起作用。我想尝试在 Dockerfile 中构建并丢弃构建缓存,一旦我不再需要它们就会使我的容器膨胀。我有什么选择?

【问题讨论】:

  • 您必须使用COPYADD 命令来实现。
  • 您能多说一些关于您要挂载的内容以及为什么需要在构建过程中挂载的内容吗? (即使在 Docker 之外,这对我来说也有点不寻常。)
  • 我有一个 arm64 设备的系统映像,它的驱动程序必须被编译。交叉编译器要求我将此系统映像挂载到它自己的安装目录,以收集构建相关的文件上下文和信息。

标签: linux docker


【解决方案1】:

正如Vladislav Supalov中的“Can You Mount a Volume While Building Your Docker Image to Cache Dependencies?”中所述

虽然 Docker 中没有在构建时拥有卷的功能,但您可以使用多阶段构建,从 Docker 缓存中受益,并通过从其他映像复制数据来节省时间 - 无论是多阶段的还是标记的。

构建映像时,您无法挂载卷。但是,您可以从另一个图像中复制 (COPY) 数据!通过将其与多阶段构建相结合,您可以预先计算一次昂贵的操作,并将结果状态作为未来迭代的起点。

例子:

FROM ubuntu as intermediate
RUN apt-get install -yqq python-dev python-virtualenv
RUN virtualenv /venv/
RUN mkdir -p /src
# those don't change often
ADD code/basic-requirements.txt /src/basic-requirements.txt
RUN /venv/bin/pip install -r /src/basic-requirements.txt

FROM ubuntu
RUN apt-get install -yqq python-dev python-virtualenv
# the data comes from the above container
COPY --from=intermediate /venv /venv
ADD code/requirements.txt /src/requirements.txt
# this command, starts from an almost-finished state every time
RUN /venv/bin/pip install -r /app/requirements.txt

在 cmets 中添加 OP:

我想在构建时使用 mount 命令在容器 fs 内部挂载一个卷,目前这不起作用。

只是想知道“挂载”操作是否与内核相关?

出于安全原因,不允许直接使用 mount(在批准的卷之外),as described here by BMitch

Docker 移除了容器的挂载权限,因为使用它可以挂载主机文件系统并转义容器。


如果你真的需要在构建过程中挂载一些东西,你可以考虑buildah,它可以在不为每一层运行容器的情况下构建(就像docker build那样),并且可以做到所以不用root。
使用ONBUILD to read your existing Dockerfile

请注意,使用“buildah mount”,您可以执行相反的操作:将指定容器的根文件系统挂载到主机可以访问的位置,并返回其位置。
那是另一种选择。

【讨论】:

  • 我猜你误会了。我想在构建时使用mount 命令在容器fs 内部安装一个卷,该命令目前不起作用。 (或者有没有办法在不显式调用 mount 的情况下进行挂载?)
  • @KaranShah 据我了解,不可能有内部挂载。
  • 由于容器的内部 FS 本身正在请求挂载,有没有办法“模拟”挂载过程?只是想知道“挂载”操作是否与内核相关?
  • @KaranShah 它与安全性相关:stackoverflow.com/a/52375147/6309
  • @KaranShah 我已经用可能的替代方法编辑了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
  • 2021-10-17
  • 2023-04-09
  • 1970-01-01
  • 2020-05-03
  • 1970-01-01
相关资源
最近更新 更多