在构build之间caching下载资源的最佳实践

我正在构build一个我想要作为Docker容器部署的Web应用程序。 应用程序依赖于存储在单独的Git存储库中的一组资产。 使用单独存储库的原因是该存储库的历史logging比当前结帐要大得多,我们希望有一种方法可以在不触及包含源代码的存储库的历史logging的情况下丢弃历史logging。

在下面的示例中,仅包含相关的部分,我将使用文件将资产存储库提交ID传递到构build过程中:

FROM something:something # [install Git and stuff] COPY ["assets_git_id", "/root/"] RUN git clone --bare git://lala/assets.git /root/assets.git \ && mkdir -p /srv/app/assets && git --git-dir=/root/assets.git --work-tree=/srv/app/assets checkout $(</root/assets_git_id) . && rm -r /root/assets.git # [set up the rest of the application] 

这里的问题是,只要该ID发生变化,整个存储库就会在构build过程中被克隆,大部分数据将被丢弃。

在这种情况下,什么是规范的方式来减less浪费的资源? 理想情况下,我希望在构build期间从容器内访问目录,其内容保持在同一构build的多个运行之间。 然后RUN脚本可以更新存储库并从中复制相关数据,而不是每次克隆整个存储库。

使用多阶段构build

 # Stage 1 FROM something:something as GitSource # [install Git] RUN git clone --bare git://lala/assets.git /root/assets.git COPY ["assets_git_id", "/root/"] RUN git --git-dir=/root/assets.git pull RUN mkdir -p /srv/app/assets RUN git --git-dir=/root/assets.git --work-tree=/srv/app/assets checkout $(</root/assets_git_id) . # Stage 2 FROM something:something COPY --from=GitSource /srv/app/assets /srb/app/assets # [set up the rest of the application] 

对于最终图像,除了正在复制到第2阶段的内容之外,它将放弃在第1阶段中执行的任何操作。