当前位置: 首页 > 知识库问答 >
问题:

condas`source activate virtualenv`在Dockerfile中不起作用

傅越
2023-03-14

我正在尝试基于公共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
/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以及assecho$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开箱即用。我很感激任何想法。谢谢!

共有1个答案

苍宝
2023-03-14

编辑:我开发了一种新的改进方法,它比“conda”、“run”语法更好。

dockerfile示例可在此GIST中获得。它通过利用自定义入口点脚本在exec执行run节的参数之前设置环境来工作。

shell是(简单地说)一个进程,它可以充当任意程序的入口点。exec“$@”允许我们启动一个新进程,继承父进程的所有环境。在本例中,这意味着我们激活conda(它基本上破坏了一堆环境变量),然后运行/bin/bash-c contents_of_docker_run

这里是我以前的方法,由伊塔马尔特纳-特鲁纳提供;多谢他们!

# 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"]

使用conda可能是一种令人沮丧的体验,因为这两种工具实际上都想独占环境,而且理论上,您不应该在容器中使用conda。但是最后期限和技术债务是一件事,有时你只需要完成它,有时conda是提供依赖的最简单的方法(看看你,GDAL)。

 类似资料:
  • 问题内容: 情境 我正在尝试基于公共continuumio / anaconda3 容器设置一个简单的docker映像( 对于docker我是一个新手,所以请更正我可能的误解 )。 的: 以此结束建筑物和图像,并显示以下错误: 激活新的虚拟环境时。 建议1: 按照这个答案,我尝试了: 乍一看,这似乎很有效,因为它输出:,但屁股清楚地表明它没有: docker文件作为MWE开箱即用。我感谢任何想法。

  • 当我试图用Dockerfile构建自己的docker图像时,我发现在使用添加或复制命令后,文件没有复制到我的图像中。 为了测试ADD命令,我创建了一个简单的dockerfile,如下所示: 我的文件结构很简单,如下所示: 当我使用docker build命令构建图像时,过程如下: 该过程以cat命令未找到测试结束。我用dockerfile脚本将txt添加到图像中。 这让我很困惑,我在不同的环境下尝

  • 问题内容: 我的Dockerfile创建一个目录,将其chown,然后再列出该目录。该目录仍归root用户所有。这是为什么? 这是Dockerfile: 这是“ docker build”的输出: Docker版本1.2.0,构建fa7b24f 主机运行Ubuntu 12.04,但具有3.13.0-36通用内核。 问题答案: 回答我自己的问题:它声明为卷。如果取出VOLUME指令,则将生效。 此外

  • 发生了什么:在Dockerfile中添加“user 999:999”,将默认的uid和gid添加到容器映像中,然后在Pod中启动容器,它的uid是999,但是gid是0。 在Docker启动的容器中,ID正确 但以Pod开始时,gid为0 如果Dockerfile运行额外的“useradd”命令,那么Pod中的gid似乎是正常的 则Pod容器中的ID与Dockerfile中设置的ID相同

  • 问题内容: 我有一个Dockerfile,我正在将其安装在一起以安装Vanilla python环境(稍后将在其中安装应用程序)。 构建运行正常,直到最后一行,我得到以下异常: 如果我进入该目录(只是为了测试是否已完成前面的步骤),我可以看到文件按预期存在: 如果我尝试仅运行命令,则会收到与上述相同的“未找到”错误。但是,如果我运行交互式shell会话,则源代码确实可以工作: 我可以从这里运行脚本

  • 我有一个Dockerfile,我将把它放在一起安装一个vanilla python环境(我将在其中安装一个应用程序,但以后再安装)。 构建运行正常,直到最后一行,我得到以下异常: 从Dockerfile运行指令运行shell脚本的最佳方法是什么来解决这个问题(我运行Ubuntu12.04LTS的默认基本映像)。