使用docker build和tmpfs构建Docker映像?

时间:2019-02-11 20:18:46

标签: docker dockerfile ramdisk tmpfs

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

This question似乎很相似,但是我的动机有所不同。我不太关心过时的图像层是否持久,但是我关心的是构建的性能。在Docker之外进行实验时,当整个源代码树位于RAM而不是磁盘中时,构建我正在使用的特定应用程序的速度提高了4倍以上。 (该项目具有许多中间版本和并行性,因此,即使是SSD也会略微跳动)

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

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

2 个答案:

答案 0 :(得分:0)

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

希望对您有帮助!

答案 1 :(得分:0)

借助BuildKit,您可以使用实验性功能为单个RUN行安装tmpfs文件系统。该文件系统在该RUN行的上下文之外将不存在,就像在容器被停止或删除时不存在tmpfs一样,因此您需要在该目录下将所有工件复制回容器文件系统中。构建结束。

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

export DOCKER_BUILDKIT=1

对于单个外壳,或更改主机上的默认值,您可以使用以下命令更新/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相当新,大多数云构建环境均不支持BuildKit,docker-compose也不支持。要查看有关这些实验功能的更多信息,请参见:https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/experimental.md