使用 github 操作在 docker 构建器中缓存 pip 依赖项
Caching pip dependencies in docker builder with github actions
我正在使用 github 操作来构建 docker 图像。我缓存了 docker 层(效果很好)但有时层没有被重用(不知道为什么!我正在关注 best practices 但忽略它)并且我正在使用后备 pip 缓存来加快构建速度。
Dockerfile 非常简单:
# syntax=docker/dockerfile:1.2
FROM python:3.10-slim
RUN python -m pip install --upgrade pip && pip cache dir
COPY requirements.txt ./
RUN --mount=type=cache,target=/root/.cache/pip/ pip install -r requirements.txt
我正在使用 --mount
标志 from syntax 1.2,它“允许构建容器为编译器和包管理器缓存目录”
Github 动作缓存(我想挂载到构建容器上):
- name: Cache pip
uses: actions/cache@v3
with:
path: /root/.cache/pip
key: pip-{{ hashFiles('requirements*.txt') }}
和docker构建
- name: Build and push
uses: docker/build-push-action@v2
with:
cache-from: type=gha
cache-to: type=gha,mode=max
如何将 pip 缓存装载到 docker 构建器容器中?
现在在 docker 文件中使用此命令缓存为空:
RUN --mount=type=cache,target=/root/.cache/pip/ pip cache info && ls /root/.cache/pip
输出:
19 RUN --mount=type=cache,target=/root/.cache/pip/ pip cache info && ls /root/.cache/pip
#19 0.387 Package index page cache location: /root/.cache/pip/http
#19 0.387 Package index page cache size: 0 bytes
#19 0.387 Number of HTTP files: 0
#19 0.387 Wheels location: /root/.cache/pip/wheels
#19 0.387 Wheels size: 0 bytes
#19 0.387 Number of wheels: 0
#19 DONE 0.4s
所以这实际上有效,并将我的安装时间从 180 秒减少到 30-40 秒,这有点古怪,但我让它适用于 pip 和纱线(纱线不会随时保存,因为我使用的是纱线 1 和大部分时间花在 I/O 阅读写作上)
您需要 buildx v0.8.0+ 来支持 --build-context
and you'll need docker frontend syntax v1.4+ to support RUN --mount
I also use github actions cache 来处理安装和缓存 pip 依赖项。看起来像这样
- github 缓存操作,安装 pip 要求,还获取 pip 缓存目录:
::set-output name=pip-dir::$(pip cache dir)
用于下一步
- 我正在使用 docker build and push action,它支持
--build-context
:
build-contexts: pip_cache=${{steps.vars.outputs.pip-dir}}
- 更新 docker 文件以使用 pip_cache 构建上下文
RUN --mount=type=cache,target=/root/.cache/pip,from=pip_cache pip install -r requirements.txt
使用缓存包构建 pip 安装:
#22 RUN --mount=type=cache,target=/root/.cache/pip,from=pip_cache pip install -r requirements.txt
#22 0.587 Requirement already satisfied: wheel in /usr/lib/python3/dist-packages (0.34.2)
#22 0.592 WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
#22 1.440 Collecting aenum==2.2.3
#22 1.442 Using cached aenum-2.2.3-py3-none-any.whl (40 kB)
#22 1.495 Collecting alembic==1.7.3
#22 1.498 Using cached alembic-1.7.3-py3-none-any.whl (208 kB)
节省构建轮子的时间是值得的,但无论如何下载都非常快。
我正在使用 github 操作来构建 docker 图像。我缓存了 docker 层(效果很好)但有时层没有被重用(不知道为什么!我正在关注 best practices 但忽略它)并且我正在使用后备 pip 缓存来加快构建速度。
Dockerfile 非常简单:
# syntax=docker/dockerfile:1.2
FROM python:3.10-slim
RUN python -m pip install --upgrade pip && pip cache dir
COPY requirements.txt ./
RUN --mount=type=cache,target=/root/.cache/pip/ pip install -r requirements.txt
我正在使用 --mount
标志 from syntax 1.2,它“允许构建容器为编译器和包管理器缓存目录”
Github 动作缓存(我想挂载到构建容器上):
- name: Cache pip
uses: actions/cache@v3
with:
path: /root/.cache/pip
key: pip-{{ hashFiles('requirements*.txt') }}
和docker构建
- name: Build and push
uses: docker/build-push-action@v2
with:
cache-from: type=gha
cache-to: type=gha,mode=max
如何将 pip 缓存装载到 docker 构建器容器中?
现在在 docker 文件中使用此命令缓存为空:
RUN --mount=type=cache,target=/root/.cache/pip/ pip cache info && ls /root/.cache/pip
输出:
19 RUN --mount=type=cache,target=/root/.cache/pip/ pip cache info && ls /root/.cache/pip
#19 0.387 Package index page cache location: /root/.cache/pip/http
#19 0.387 Package index page cache size: 0 bytes
#19 0.387 Number of HTTP files: 0
#19 0.387 Wheels location: /root/.cache/pip/wheels
#19 0.387 Wheels size: 0 bytes
#19 0.387 Number of wheels: 0
#19 DONE 0.4s
所以这实际上有效,并将我的安装时间从 180 秒减少到 30-40 秒,这有点古怪,但我让它适用于 pip 和纱线(纱线不会随时保存,因为我使用的是纱线 1 和大部分时间花在 I/O 阅读写作上)
您需要 buildx v0.8.0+ 来支持 --build-context
and you'll need docker frontend syntax v1.4+ to support RUN --mount
I also use github actions cache 来处理安装和缓存 pip 依赖项。看起来像这样
- github 缓存操作,安装 pip 要求,还获取 pip 缓存目录:
::set-output name=pip-dir::$(pip cache dir)
用于下一步 - 我正在使用 docker build and push action,它支持
--build-context
:
build-contexts: pip_cache=${{steps.vars.outputs.pip-dir}}
- 更新 docker 文件以使用 pip_cache 构建上下文
RUN --mount=type=cache,target=/root/.cache/pip,from=pip_cache pip install -r requirements.txt
使用缓存包构建 pip 安装:
#22 RUN --mount=type=cache,target=/root/.cache/pip,from=pip_cache pip install -r requirements.txt
#22 0.587 Requirement already satisfied: wheel in /usr/lib/python3/dist-packages (0.34.2)
#22 0.592 WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
#22 1.440 Collecting aenum==2.2.3
#22 1.442 Using cached aenum-2.2.3-py3-none-any.whl (40 kB)
#22 1.495 Collecting alembic==1.7.3
#22 1.498 Using cached alembic-1.7.3-py3-none-any.whl (208 kB)
节省构建轮子的时间是值得的,但无论如何下载都非常快。