我正在尝试基于公共continuumio / anaconda3容器设置一个简单的docker映像(对于docker我是一个新手,所以请更正我可能的误解)。
的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 .
结束建筑物和图像,并显示以下错误:
/bin/sh: 1: source: not found
激活新的虚拟环境时。
按照这个答案,我尝试了:
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开箱即用。我感谢任何想法。谢谢!
编辑:我已经开发了一种新的,改进的方法,它比"conda", "run"
语法更好。
样本dockerfile可在此摘要中找到。它通过利用自定义入口点脚本来设置环境,然后再exec
使用该RUN
节的参数。
外壳程序(非常简单)是一个可以充当任意程序入口点的进程。exec "$@"
使我们能够启动新流程,并继承父流程的所有环境。在这种情况下,这意味着我们激活conda(基本上破坏了许多环境变量),然后运行/bin/bash -c CONTENTS_OF_DOCKER_RUN
。
这是我以前的方法,由Itamar Turner-Trauring提供;非常感谢他们!
# Create the environment:
COPY environment.yml .
RUN conda env create -f environment.yml
# Set the default docker build shell to run as the conda wrapped process
SHELL ["conda", "run", "-n", "vigilant_detect", "/bin/bash", "-c"]
# Set your entrypoint to use the conda environment as well
ENTRYPOINT ["conda", "run", "-n", "myenv", "python", "run.py"]
修改ENV
可能不是最好的方法,因为conda喜欢控制环境变量本身。此外,您的自定义conda env可能会激活其他脚本来进一步调制环境。
这将利用conda run在启动新的bash shell之前“将条目添加到环境的PATH并运行环境可能包含的所有激活脚本”。
使用conda可能会令人沮丧,因为这两个工具都有效地希望垄断环境,并且从理论上讲,您永远不需要容器内的conda。但是截止日期和技术债务是一件事情,有时您只是必须完成它,有时conda是配置依赖项的最简单方法(在您看来,GDAL)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句