Docker 缓存 pip install 的奇怪行为

Jor*_*dan 5 caching pip docker github-actions buildx

我正在 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
Run Code Online (Sandbox Code Playgroud)

不过,我遇到了这个奇怪的问题,哪里requirements.txt没有改变,第一行( )COPY正确使用了缓存,但第二行( )RUN使用缓存,并继续重新构建所有包。

我不知道是什么原因造成的。如果COPY正确使用缓存,那么它必须识别出requirements.txt没有改变,如果requirements.txt没有改变,我不明白为什么它不使用命令的缓存RUN

最糟糕的是,它是间歇性的。有些构建它使用缓存,有些构建它重新构建包,在两种情况下requirements.txt(或任何前面的 Dockerfile 行)都没有改变。

我错过了什么吗?