docker 的 conda 缓存

lhk*_*lhk 5 docker conda

这是一个与以下内容非常相似的问题:Docker build: use http cache

我想设置一个带有自定义 conda 环境的 docker 容器。对应的dockerfile是:

FROM continuumio/miniconda3

WORKDIR /app
COPY . /app

RUN conda update conda
RUN conda env create -f environment.yml
RUN echo "source activate my_env" > ~/.bashrc
ENV PATH /opt/conda/envs/env/bin:$PATH
Run Code Online (Sandbox Code Playgroud)

我的环境相当大,最小版本可能如下所示:

name: my_env
channels:
  - defaults
dependencies:
  - python=3.6.8=h0371630_0
prefix: /opt/conda
Run Code Online (Sandbox Code Playgroud)

每次对依赖项进行更改时,我都必须重建映像。这意味着重新下载所有软件包。是否可以以某种方式设置缓存?将容器化的 conda 与容器外的缓存接口可能会首先破坏容器化它的想法。但也许这仍然有可能以某种方式?

小智 10

Docker Buildkit现在有一个专门用于此目的的功能,称为缓存挂载。有关准确的语法,请参见此处。要使用此功能,请更改:

RUN conda env create -f environment.yml
Run Code Online (Sandbox Code Playgroud)

到

RUN --mount=type=cache,target=/opt/conda/pkgs conda env create -f environment.yml
Run Code Online (Sandbox Code Playgroud)

并确保 Buildkit 已启用(例如通过export DOCKER_BUILDKIT=1)。缓存将在运行之间持续存在,并在并发构建之间共享。


lhk*_*lhk 5

这是对这个问题的一个非常间接的回答,但对我来说就像一种魅力。

在许多依赖项中,有一个很大的子集永远不会改变。我总是需要 python 3.6、numpy、pandas、torch、...

因此,您可以缓存 docker 并重用已经安装了这些依赖项的基础镜像,而不是缓存 conda:

FROM continuumio/miniconda3

WORKDIR /app
COPY environment.yml /app

# install package dependencies
RUN conda update conda
RUN conda env create -f environment.yml
RUN echo "source activate api_neural" > ~/.bashrc
ENV PATH /opt/conda/envs/env/bin:$PATH
Run Code Online (Sandbox Code Playgroud)

然后你可以在第二个 dockerfile 中添加额外的配置:

FROM base_deps

# add additional things on top, here I'm running some python in the conda env
RUN /bin/bash -c 'echo $(which python);\
source activate api_neural;\
python -c "import nltk; nltk.download(\"wordnet\"); nltk.download(\"words\")";\
python -m spacy download en;\
python -c "from fastai import untar_data, URLs; model_path = untar_data(URLs.WT103, data=False)"'
Run Code Online (Sandbox Code Playgroud)