docker的康达缓存

docker的康达缓存,docker,conda,Docker,Conda,这是一个非常类似的问题: 我想设置一个具有自定义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/

这是一个非常类似的问题:

我想设置一个具有自定义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
我的环境相当大,最低版本可能如下所示:

name: my_env
channels:
  - defaults
dependencies:
  - python=3.6.8=h0371630_0
prefix: /opt/conda
每次对依赖项进行更改时,我都必须重建映像。这意味着重新下载所有软件包。 是否可以以某种方式设置缓存? 将容器化的conda与容器外部的缓存连接起来,可能会首先打破容器化conda的想法。 但也许这在某种程度上仍然是可能的?

是对这个问题的一个非常间接的回答,但它对我来说很有魅力

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

因此,您可以缓存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
然后,您可以在第二个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)"'

另一个选项是将dev目录绑定到docker容器上的目录。在这种情况下,您的更改将自动更新容器。只有在实际更新任何python包时,才需要重建映像

docker run-it--mount“type=bind,source=/local/path,target=/container/path”container\u name bash
例如,我在VS代码中调试的任务如下所示:

name: my_env
channels:
  - defaults
dependencies:
  - python=3.6.8=h0371630_0
prefix: /opt/conda
{
“类型”:“docker run”,
“标签”:“docker运行:调试”,
//无需在绑定开发环境时进行构建
//“dependsOn”:[“docker build”],
“python”:{
“文件”:“example.py”
},
“dockerRun”:{
“图像”:“图像名称”,
“容器名称”:“容器名称”,
//第一部分允许容器使用主机显示
//第二部分将本地dev文件夹绑定到容器
“自定义选项”:
--rm-e DISPLAY=$DISPLAY-v/tmp/.X11 unix:/tmp/.X11 unix--mount\“type=bind,source=/local/path,target=/container/path”
}
},
对于Docker,现在有了一个功能,叫做缓存挂载。有关精确语法,请参见。要使用此功能,请更改:

RUN conda env create -f environment.yml


并确保Buildkit已启用(例如通过导出DOCKER\u Buildkit=1)。缓存将在运行之间保持,并在并发构建之间共享。

您能否澄清基本部署的定义位置。这只是一个名为“base_deps”的文件,还是以其他方式定义的?它是由第一个代码段创建的图像