如何优化Docker构建的图像与大型网络静态内容



我们需要生成一个docker映像,它需要很长的时间来构建,可能需要大约45分钟到一个小时。构建包括首先从不同的npm位置下载许多(100+(.tgz文件,然后解压缩它们以由web服务器提供服务(详细信息将省略(。

为了简单起见,我们假设正好有100个模块,这个应用程序只是一群不同的开发团队的组合,他们都将自己的网络内容交付给这张图片。根据需要,100个模块中的任何一个都可以获得带有新版本的新版本,而该新版本需要重新生成一个新映像,其中99个模块没有更改,现在只有1个模块更改。

在运行docker build命令之前的构建目录如下所示:

/build/libs/server.jar
/embeddedDir/
module1-1.0.0/package/...
module2-1.0.0/package/...
module3-1.0.0/package/...
module4-1.0.0/package/...
// 100 modules in total

Dockerfile看起来像这样:

FROM certifiedBaseImage:1.0.0
WORKDIR /app
COPY /embeddedDir/ ./embeddedDir/
COPY /build/libs/server.jar ./server.jar
ENTRYPOINT ["startmyserver"]

第一层COPY需要很长时间才能完成(45m-1hr(。"/embeddedDir";从NPM的各种模块包中复制了2GB的静态内容。可能有成千上万的小静态文件,css,图像等

在构建过程中,2GB的网络内容需要很长时间才能复制到docker映像中,这似乎很奇怪。特别是如果你考虑到这个构建机器可以在不到一分钟的时间内下载和解压所有这些内容,这是惊人的速度。

所以我的优化想法是制作一个中间的基础图像。所以现在我有两个这样的文件:

Dockerfile_base

FROM certifiedBaseImage:1.0.0
WORKDIR /app
COPY /embeddedDir/ ./embeddedDir/
COPY /inventory.json ./inventory.json

";inventory.json";是基本映像中的所有模块及其版本的列表。

Dockerfile_new

FROM intermediateBaseImage:1.0.0
COPY /embeddedDir/ ./embeddedDir/
COPY /build/libs/server.jar ./server.jar
ENTRYPOINT ["startmyserver"]

在构建Dockerfile_new之前,我首先提取intermediateBaseImage,然后从那里复制inventory.json,并确保不要下载任何已经存在的模块,因此embeddedDir中只有在该构建中新的文件。在最终映像中有几个模块的旧版本是可以的,因为服务器只需要提供每个模块的最新版本。然后,我有一个单独的构建,它每周生成Dockerfile_base,并自动将Dockerfile_new上的版本更新到更新后的基础。

这使我的构建时间大大提高了一个数量级。构建docker镜像的时间从45分钟减少到了4分钟。

但现在我的问题是,安全扫描认为我的输出图像库是intermediateBaseImage,它抱怨这个图像不是";认证的一个";。当然,我上面的例子并不是真正的基础图像名称,只是一个例子。但足以说明安全扫描不信任";中间一个";我每周生成一次。

以下是我的问题:

有没有什么策略可以改善我的构建时间,但仍然可以将最终的docker图像视为具有认证的基本图像(这样扫描就满足了?(

您正在寻找多阶段构建。

相关内容

  • 没有找到相关文章

最新更新