我正在构建一个我希望部署为Docker容器的Web应用程序。应用程序依赖于存储在单独的Git存储库中的一组资产。使用单独存储库的原因是该存储库的历史记录比当前结帐更大,我们希望有一种方法可以丢弃该历史记录,而无需触及包含源代码的存储库的历史记录。 / p>
在下面的示例中,仅包含相关部分,我使用文件将资产存储库提交ID传递到构建过程中:
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发生更改,整个存储库就会在构建过程中被克隆,并且大部分数据都会被丢弃。
在这种情况下减少浪费资源的规范方法是什么?理想情况下,我希望在构建期间从容器内部访问目录,其内容保持在同一构建的多次运行之间。然后,RUN
脚本可以只更新存储库并从中复制相关数据,而不是每次都克隆整个存储库。
答案 0 :(得分:0)
使用多阶段构建
# 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]
对于最终图像,它将丢弃您在第1阶段所做的任何操作,除了复制到第2阶段的内容。