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

fdm*_*ion 4 ramdisk tmpfs docker dockerfile

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

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

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

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

BMi*_*tch 5

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

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

export DOCKER_BUILDKIT=1
Run Code Online (Sandbox Code Playgroud)

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

{
  "features": {"buildkit": true}
}
Run Code Online (Sandbox Code Playgroud)

启用 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
...
Run Code Online (Sandbox Code Playgroud)

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