无法在 dockerfile 中创建 conda env

Cant create conda env in dockerfile

我的应用程序文件夹中有一个 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 并且它有效,但为什么在 运行 指令中不起作用??

在示例中,我经常在需要 conda 的 dockerfiles 中看到:

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

有人可以解释为什么必须使用 && 使其成为一个命令吗?为什么 运行ning "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。创建环境并更改磁盘上的文件。

声明 #2 source activate myenvfromymlfile。在 bash 会话中加载一些内容。此处未更改磁盘

语句 #3 和 #4 指定当您 运行 容器

时会发生什么
ENTRYPOINT ["python"]
CMD ["application.py"]

所以现在当您 运行 容器时。您在步骤#2 中所做的任何操作都不存在,因为 shell 已启动到 运行 步骤 #2,当它完成时 shell 已关闭。现在,当你 运行 启动一个新的 shell 图像时,它是 b运行d new shell 而现在不知道你的 docker 文件中的过去你运行source activate myenvfromymlfile

现在您想 运行 这个 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 中的环境,然后 运行 您的程序。