我正在 GitHub Actions 工作流程中构建 Docker 容器,并且我有一个使用Docker buildx的自定义缓存解决方案。本质上,我使用docker buildx 构建 --cache-from
和--cache-to
参数来转储上一次构建的缓存,将其存储在外部,然后为下一次构建加载它以节省时间。
在大多数情况下,这工作得很好。大部分构建时间都花在了pip install
我们使用 Alpine 并且没有可用的轮子上,因此它必须构建包,因此使用缓存跳过这一步可以节省大量资金。
Dockerfile 中有两个相关的行:
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
不过,我遇到了这个奇怪的问题, whererequirements.txt
没有改变,第一行 (the COPY
) 正确使用缓存,但第二行 (the RUN
) 不使用缓存,并继续重新构建所有包。
我无法弄清楚是什么原因造成的。如果COPY
正确使用缓存,那么它必须识别出requirements.txt
没有改变,如果requirements.txt
没有改变,我不明白为什么它不会为RUN
命令使用缓存。
最糟糕的是,它是间歇性的。一些构建它使用缓存,一些构建它重新构建包,在这两种情况下requirements.txt
(或任何前面的 Dockerfile 行)都没有改变。
我错过了什么吗?