condas`source activate virtualenv`在Dockerfile中不起作用
脚本
我正在试图build立一个简单的docker镜像( 对于docker来说我是个新手,所以请纠正我可能的错误观念 ),它基于public continuumio / anaconda3容器。
Dockerfile
:
FROM continuumio/anaconda3:latest # update conda and setup environment RUN conda update conda -y \ && conda env list \ && conda create -n testenv pip -y \ && source activate testenv \ && conda env list
通过docker build -t test .
构build和映像docker build -t test .
以错误结束:
/bin/sh: 1: source: not found
激活新的虚拟环境时。
build议1:
按照这个答案,我试过了:
FROM continuumio/anaconda3:latest # update conda and setup environment RUN conda update conda -y \ && conda env list \ && conda create -y -n testenv pip \ && /bin/bash -c "source activate testenv" \ && conda env list
这似乎起初工作,因为它输出: prepending /opt/conda/envs/testenv/bin to PATH
,但conda env list
以及echo $PATH
清楚地表明它不:
[...] # conda environments: # testenv /opt/conda/envs/testenv root * /opt/conda ---> 80a77e55a11f Removing intermediate container 33982c006f94 Step 3 : RUN echo $PATH ---> Running in a30bb3706731 /opt/conda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
docker文件作为一个MWE是可以工作的。 我很欣赏任何想法。 谢谢!
使用docker ENV
指令可以将虚拟环境path持久地添加到PATH
。 虽然这不能解决conda env list
列出的选定环境。
见MWE:
FROM continuumio/anaconda3:latest # update conda and setup environment RUN conda update conda -y \ && conda create -y -n testenv pip ENV PATH /opt/conda/envs/testenv/bin:$PATH RUN echo $PATH RUN conda env list
在ccauet的答案(我无法去工作)上捎带,并且查尔斯·杜菲(Charles Duffey)对这个问题的评论不仅仅是PATH
,而是关于这个问题。
在激活环境时,conda会设置以下variables,以及一些在停用环境时可以引用的备份默认值。 这些variables已经从Dockerfile中省略了,因为根conda环境不需要再次使用。 作为参考,这些是CONDA_PATH_BACKUP
, CONDA_PS1_BACKUP
和_CONDA_SET_PROJ_LIB
。 它也设置PS1
为了显示(testenv)
在terminal提示行的左边,也被省略。 以下陈述将做你想要的。
ENV PATH /opt/conda/envs/testenv/bin:$PATH ENV CONDA_DEFAULT_ENV testenv ENV CONDA_PREFIX /opt/conda/envs/testenv
为了缩小创build的图层数量,您可以将这些命令组合成一个ENV命令,并同时设置所有的variables。
可能还有一些其他的variables需要根据包来设置。 例如,
ENV GDAL_DATA /opt/conda/envs/testenv/share/gdal ENV CPL_ZIP_ENCODING UTF-8 ENV PROJ_LIB /opt/conda/envs/testenv/share/proj
获取此信息的简单方法是在根环境中调用printenv > root_env.txt
,激活testenv
,然后调用printenv > test_env.txt
,并检查diff root_env.txt test_env.txt
。