问题:如何在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中复制出来,然后在复制时使用该新位置来解决。
答案 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