【发布时间】:2020-04-04 23:29:45
【问题描述】:
我正在尝试使用environment.yml 文件中指定的新 conda 环境创建 docker 映像,然后在调用 docker run 时自动激活该环境。我已经完全按照this post 的工作流程进行了操作,经过大量研究后,我现在很困惑。我也做了很多关于堆栈溢出的挖掘,例如here,但运气不好。
这是我的dockerfile 的内容(我相信这应该是完全可重现的):
FROM continuumio/anaconda3
ADD environment.yml /tmp/environment.yml
RUN conda env create -f /tmp/environment.yml
RUN echo "conda activate $(head -1 /tmp/environment.yml | cut -d' ' -f2)" >> ~/.bashrc
ENV PATH /opt/conda/envs/$(head -1 /tmp/environment.yml | cut -d' ' -f2)/bin:$PATH
以及定义环境的yaml文件:
name: pointcloudz
channels:
- conda-forge
- defaults
dependencies:
- python=3.7
- gdal
- pdal
- entwine
dockerfile 构建没有错误,但是当我执行时
docker run -it pdal_pipeline
我收到以下错误(在容器内),并且新环境未激活:
CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
To initialize your shell, run
$ conda init <SHELL_NAME>
我已经深入互联网寻找答案,但找不到解决方案。我真的需要创建环境,将environment.yml 中指定的包安装到其中,并在运行容器时自动运行。奇怪的是,下面的dockerfile 环境是直接使用conda create 创建的,而不是yaml 文件的工作方式完全符合预期,但我无法从dockerfile 将所需的包安装到新创建的环境中自己。
FROM continuumio/miniconda3
RUN conda create -n env python=3.6
RUN echo "source activate env" > ~/.bashrc
ENV PATH /opt/conda/envs/env/bin:$PATH
这里的任何智慧都会受到极大的赞赏。
【问题讨论】:
-
我没有看到您在错误消息中尝试过建议操作的任何地方。您是否尝试在 Dockerfile 中使用
RUN conda init bash? -
我刚刚尝试了这个示例,它对我来说效果很好。也许您需要在 docker build 上使用
--pull以确保continuumio/anaconda3是最新的图像。不要修改 PATH,conda activate 会为您完成。 (并且 head 命令没有作为 ENV 的一部分解析,命令本身被添加到 PATH)
标签: python docker anaconda yaml conda