7

问题:您如何在 Dockerfile 或docker build命令行中指定您希望将 tmpfs 挂载到构建容器中?这是在拆分构建的上下文中 - 第一个容器将使用 RAM 磁盘,从源代码构建应用程序,第二阶段将结果复制到新容器。

这个问题似乎很相似,但我的动机不同。我不太关心过时的图像层持续存在,但我关心的是构建的性能。在 Docker 之外进行实验时,当整个源代码树都在 RAM 中而不是在磁盘中时,构建我正在使用的特定应用程序的速度提高了 4 倍以上。(该项目有许多中间构建和并行性,所以即使是 SSD 也会有点颠簸)

由于 Docker 确实支持在正常docker run命令期间挂载 tmpfs,因此似乎应该有一种方法可以将其包含在 Dockerfile 中?但是,我似乎无法在任何地方找到此信息 - 几乎每次搜索“tmpfs”和“dockerfile”或“build”或“ramdisk”等等都只是指向上面链接的帖子或 Docker 的关于使用 tmpfs 的文档容器以docker run.

如果 tmpfs 不会持续到第二个容器的组装,那将是可以接受的。这可以通过在容器退出之前将构建的应用程序从构建容器内的 tmpfs 中复制出来,然后在复制时使用该新位置来解决。

4

2 回答 2

6

使用BuildKit,您可以使用实验性功能为单行挂载 tmpfs 文件系统RUN。该文件系统将不存在于该RUN行的上下文之外,就像容器停止或删除时不存在 tmpfs 一样,因此您需要在构建结束时将任何工件复制回容器文件系统。

对于 BuildKit,您至少需要 18.09,您可以通过以下任一方式启用它:

export DOCKER_BUILDKIT=1

对于单个 shell,或者要更改主机上的默认值,您可以使用以下命令更新 /etc/docker/daemon.json:

{
  "features": {"buildkit": true}
}

启用 BuildKit 后,Dockerfile 将如下所示:

# syntax=docker/dockerfile:experimental
FROM your_base_image
COPY src /src
RUN --mount=type=tmpfs,target=/build \
    cp -r /src/. /build/ \
 && cd /build \
 && make your_project \
 && cp /build/result.bin /result.bin
...

请注意,BuildKit 相当新,在大多数云构建环境中不受支持,并且 docker-compose 也不支持。要了解有关这些实验性功能的更多信息,请参阅:https ://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/experimental.md

于 2019-02-11T23:00:57.607 回答
1

在 docker 中,只有在您这样做时才能配置挂载点docker run。dockerfile 中的目录不应更改其行为。这就是安装点仅在运行中的原因。

我希望它有帮助!

于 2019-02-11T20:59:31.563 回答