无法在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中的环境,然后运行你的程序。