如何使 docker-build 也缓存 pip 安装?

How to make docker-build to cache the pip installs as well?

我正在使用以下 Dockerfile

FROM ubuntu

RUN apt-get update
RUN apt-get install -y \
    python3.9 \
    python3-pip

COPY . /app
WORKDIR /app

RUN pip install -r requirements.txt

EXPOSE 8501

ENTRYPOINT [ "streamlit", "run" ]
CMD ["app.py"]

每当我重建图像时,docker 使用以前缓存的图像版本并快速构建它,除非它到达 RUN pip install -r requirements.txt 部分,每次我重建图像时它都会运行图像(不缓存)。问题是 requirements.txt 中的一个要求是 streamlit==1.9.0,它有大量的依赖关系,所以它减慢了重建过程。长话短说,docker 正在缓存 RUN apt-get install foo 而不是 RUN pip install bar,我想这是预料之中的。当 requirements.txt 文件中的列表很长时,您如何找到解决方法来加快图像重建过程?

它无法缓存它,因为您在应用程序中的文件不断变化(我猜)。通常的做法是先单独复制requirements.txt,然后安装,然后复制其他所有内容。这样,docker 可以缓存安装,因为 requirements.txt 没有改变。

FROM ubuntu

RUN apt-get update
RUN apt-get install -y \
    python3.9 \
    python3-pip

WORKDIR /app
COPY requirements.txt . # Copy ONLY requirements. This layer is cached if this file doesn't change

RUN pip install -r requirements.txt # This uses the cached layer if the previous layer was cached aswell

COPY . .

EXPOSE 8501

ENTRYPOINT [ "streamlit", "run" ]
CMD ["app.py"]

Docker BuildKit 最近在构建时引入了挂载。

https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/syntax.md

对于 PIP 的特定场景,请查看 https://dev.doroshev.com/docker-mount-type-cache/