我正在为我的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
答案 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提取和存档提取。)