使用 docker 构建和 tmpfs 构建 Docker 图像?
Build a Docker image using docker build and a tmpfs?
问题:如何在 Docker 文件或 docker build
命令行中指定要在构建容器中安装 tmpfs?这是在拆分构建的上下文中 - 第一个容器将使用 RAM 磁盘,从源构建应用程序,第二阶段将结果复制到新容器。
This question 看起来很相似,但我的动机不同。我不太关心陈旧的图像层持续存在,但我关心构建的性能。在 Docker 之外进行试验时,如果整个源代码树都在 RAM 中而不是在磁盘中,构建我正在使用的特定应用程序的速度要快 4 倍以上。 (该项目有许多中间构建和并行性,因此即使是 SSD 也会有一些不稳定)
因为 Docker 确实支持在正常的 docker run
命令中安装 tmpfs,似乎应该有一种方法可以将其包含在 Docker 文件中?但是,我似乎无法在任何地方找到此信息 - 几乎每次搜索 "tmpfs" 和 "dockerfile" 或 "build" 或 "ramdisk" 等等都指向上面的链接post 或 Docker 关于在以 docker run
.
开头的容器中使用 tmpfs 的文档
如果 tmpfs 不会持续到第二个容器的程序集,那将是可以接受的。这可以通过在容器退出之前将构建的应用程序从构建容器中的 tmpfs 中复制出来,然后在复制时使用新位置来简单地解决。
在 docker 中,挂载点仅在您执行 docker run
时才可配置。 docker 文件中的目录不应更改其行为。这就是为什么安装点仅在 运行 中。
希望对您有所帮助!
使用 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/experimental.md
问题:如何在 Docker 文件或 docker build
命令行中指定要在构建容器中安装 tmpfs?这是在拆分构建的上下文中 - 第一个容器将使用 RAM 磁盘,从源构建应用程序,第二阶段将结果复制到新容器。
This question 看起来很相似,但我的动机不同。我不太关心陈旧的图像层持续存在,但我关心构建的性能。在 Docker 之外进行试验时,如果整个源代码树都在 RAM 中而不是在磁盘中,构建我正在使用的特定应用程序的速度要快 4 倍以上。 (该项目有许多中间构建和并行性,因此即使是 SSD 也会有一些不稳定)
因为 Docker 确实支持在正常的 docker run
命令中安装 tmpfs,似乎应该有一种方法可以将其包含在 Docker 文件中?但是,我似乎无法在任何地方找到此信息 - 几乎每次搜索 "tmpfs" 和 "dockerfile" 或 "build" 或 "ramdisk" 等等都指向上面的链接post 或 Docker 关于在以 docker run
.
如果 tmpfs 不会持续到第二个容器的程序集,那将是可以接受的。这可以通过在容器退出之前将构建的应用程序从构建容器中的 tmpfs 中复制出来,然后在复制时使用新位置来简单地解决。
在 docker 中,挂载点仅在您执行 docker run
时才可配置。 docker 文件中的目录不应更改其行为。这就是为什么安装点仅在 运行 中。
希望对您有所帮助!
使用 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/experimental.md