如何在install.sh中缓存克隆git repo

时间:2019-02-23 11:25:47

标签: python git docker caching

我正在为我的Flask应用程序构建一个docker。在应用程序中,我正在使用从github克隆的python模块。我们将其称为模块A。模块A由从git克隆的另一个模块组成,我们将其称为模块B。模块A具有一个install.sh脚本,在其中复制了模块B。模块B由从git克隆的另一个模块(C)组成,并且是从模块B的install.sh脚本克隆的。因此,在我的dockerfile中,我运行模块A的install.sh,它运行{{模块B的1}},并运行模块C的install.sh

install.sh

我需要在模块A中更改一些代码以适合我的应用程序,因此我手动对其进行克隆并更改代码。

在我使用的dockerfile中

flask_app
├── Dockerfile
├── A
|   ├── install.sh
|   ├── B
|       ├── install.sh
|       ├── C
|           ├── install.sh

将安装所有需要的模块。问题是,当我再次构建docker时,它不使用缓存。这是一个巨大的问题,因为构建模块C需要1个小时。如何使docker缓存此命令?

这是整个dockerfile:

RUN cd ./A && ./install.sh

1 个答案:

答案 0 :(得分:0)

Docker层缓存非常线性:如果在特定步骤中发生任何更改,则该步骤或该步骤之后的任何内容都不会被缓存。

尤其是这两行:

ADD . /app
RUN cd ./A && ./install.sh

如果源代码树中的任何地方发生任何更改,将导致ADD步骤不使用缓存,这意味着RUN步骤也不会使用。

如果A目录不经常更改,那么您可以按照自己的步骤复制并运行该目录:

COPY ./A/ /app/A/
RUN cd ./A && ./install.sh

COPY . /app

(这与您为requirements.txt文件所拥有的模式相同,原因基本上是相同的。我通常更喜欢COPY而不是ADD,除非我明确希望自动进行URL提取和存档提取。)