让Dockerfile里的包管理器也用上缓存
问题
FROM python:3.9
COPY requirements.txt .
RUN pip install -r requirements.txt
当使用类似以上的 Dockerfile
来构建镜像,无论是第几次构建镜像pip
都要重新下载 requirements.txt
中的所有依赖,这很费时间。理想方案是,除了第一次构建,后续的构建只有当requirements.txt
中新增依赖时pip
才去从互联网上下载内容,否则直接使用本机 Docker 中缓存的依赖(之前构建时产生的)。
解决方案
RUN
命令支持一个选项 --mount=type=cache
,可以挂载一个临时目录来为编译器和包管理器缓存目录。
先决条件
为了开启 Docker Buildkit 功能,终端执行 export DOCKER_BUILDKIT=1
命令。
Dockerfile
上面的 Dockerfile
改写成如下形式:
# syntax=docker/dockerfile:1.3
FROM python:3.9
COPY requirements.txt .
RUN --mount=type=cache,target=/root/.cache \
pip install -r requirements.txt
上面的 # syntax=docker/dockerfile:1.3
是 BuildKit Dockerfile frontend 需要的。
参考
- RUN --mount=type=cache
- BuildKit Dockerfile frontend
- Speed up pip downloads in Docker with BuildKit’s new caching
文完撒花🎉!感谢观看👏!