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

9njqaruj  于 2023-02-07  发布在  Docker
关注(0)|答案(2)|浏览(224)

问:如何在Dockerfile或docker build命令行中指定您希望在构建容器中挂载一个tmpfs?这是在拆分构建的上下文中-第一个容器将使用RAM磁盘,从源代码构建应用程序,第二个阶段将结果复制到一个新容器。
This question看起来很相似,但我的动机不同。我并不太关心陈旧的图像层的持久性,但我关心的是构建的 * 性能 *。当在Docker之外进行试验时,当整个源代码树在RAM中而不是在磁盘中时,构建我正在使用的特定应用程序的速度快了4倍以上。(该项目有许多中间构建和并行性,所以即使是SSD也会有一些颠簸)
由于Docker确实支持在正常的docker run命令期间挂载tmpfs,因此似乎应该有一种方法将其包含在Dockerfile中。我似乎在任何地方都找不到这些信息--几乎每一个搜索“tmpfs”和“dockerfile”或“build”或“ramdisk”等的结果都指向上面链接的帖子或Docker's关于在以docker run开头的容器中使用tmpfs的文档。
如果tmpfs甚至不能持续到第二个容器的程序集,这也是可以接受的,可以通过在构建容器退出之前将构建的应用程序从构建容器内的tmpfs中复制出来,然后在复制时使用新的位置来解决。

yzuktlbb

yzuktlbb1#

使用BuildKit,您可以使用实验特性为单个RUN行挂载tmpfs文件系统,该文件系统不会存在于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/reference.md

坞站合成:

在v1.25.0中发布了对Docker-compose中BuildKit的支持。为了启用它,请执行以下配置:

export DOCKER_BUILDKIT=1 # or configure in daemon.json
    export COMPOSE_DOCKER_CLI_BUILD=1

在shell中设置了这些变量之后,现在可以使用BuildKit运行docker-compose build
在Windows中,您可以在控制台中执行:

setx DOCKER_BUILDKIT 1 # or configure in daemon.json
    setx COMPOSE_DOCKER_CLI_BUILD 1

之后将需要重新启动您的控制台

lyr7nygr

lyr7nygr2#

在docker中,挂载点只有在你执行docker run时才是可配置的。docker文件中的目录不应该改变它的行为。这就是为什么挂载点只在运行中。
希望能有所帮助!

相关问题