无法在dockerfile中创buildconda env

我在我的应用程序文件夹中有一个environment.yml

我在我的dockerfile中有这个:

 RUN conda env create RUN source activate myenvfromymlfile 

当我运行容器,虽然env没有激活。 如果我do conda env list是看/opt/conda被激活:

 root@9c7181cf86aa:/app# conda env list # conda environments: # myenvfromymlfile /opt/conda/envs/myenvfromymlfile root * /opt/conda 

如果我附加到容器,我可以手动运行source activate myenvfromymlfile ,它的工作原理,但为什么不在RUN指令工作?

在例子中,我经常在需要conda的dockerfiles中看到这个:

 CMD [ "source activate your-environment && exec python application.py" ] 

有人可以解释为什么有必要使用&&来使它成为一个单一的命令? 为什么在一个RUN指令中运行“source activate”不起作用? 我想让我的dockerfile看起来像这样:

 RUN conda env create RUN source activate myenvfromymlfile ENTRYPOINT ["python"] CMD ["application.py"] 

考虑下面的Dockerfile

 RUN conda env create RUN source activate myenvfromymlfile ENTRYPOINT ["python"] CMD ["application.py"] 

声明#1 conda env create 。 创build环境并更改文件的磁盘。

声明#2 source activate myenvfromymlfile 。 在bash会话中加载一些东西。 没有在这里做磁盘更改

语句#3和#4指定在运行容器时发生的情况

 ENTRYPOINT ["python"] CMD ["application.py"] 

所以,现在当你运行容器。 你在步骤2中做的任何事情都不存在,因为一个shell被启动来运行第二步,当它完成时,shell被closures。 现在当你运行这个镜像时,一个新的shell被启动了,这是一个全新的shell,现在已经知道在你的dockerfile里面你运行了source activate myenvfromymlfile

现在你想在你创build的环境中运行这个application.py 。 docker的默认shell是sh -c 。 所以当你设置CMD如下

 CMD [ "source activate your-environment && exec python application.py" ] 

在容器开始处执行的最终命令变成了

 sh -c "source activate your-environment && exec python application.py" 

它激活当前shell中的环境,然后运行你的程序。