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

在构建期间在Dockerfile中激活和切换Anaconda环境

鄂曦之
2023-03-14

我已经尝试了几个小时,但不知道如何在构建过程中在 Dockerfile 中激活和切换 anaconda 环境

这是初始代码:

FROM nvidia/cuda:10.1-cudnn7-devel-ubuntu16.04

# Set user
ENV SETUSER myuser

RUN useradd -m $SETUSER
USER $SETUSER
WORKDIR /home/$SETUSER

# Install Anaconda
RUN wget https://repo.anaconda.com/archive/Anaconda3-2019.03-Linux-x86_64.sh
RUN bash Anaconda3-2019.03-Linux-x86_64.sh -b
RUN rm Anaconda3-2019.03-Linux-x86_64.sh

# Set path to conda
ENV CONDA_ENV_NAME mynewenv
RUN /home/$SETUSER/anaconda3/condabin/conda create -q --name $CONDA_ENV_NAME python=3.6 && \
    /home/$SETUSER/anaconda3/condabin/conda clean --yes --all
RUN /home/$SETUSER/anaconda3/condabin/conda activate base #Just for testing anaconda environment

起初,Docker 中的 anaconda 会抱怨 shell 设置不正确,因此在 conda 创建命令之后,我添加了:

RUN /home/$SETUSER/anaconda3/condabin/conda init bash
RUN /bin/bash -c "source /home/$SETUSER/.bashrc"
RUN /home/$SETUSER/anaconda3/condabin/conda activate base

在构建docker映像后运行这3个命令是可行的(即在调用docker run container-name后交互运行),但由于某种原因,在构建容器时不起作用。我发现$PATH变量在构建期间没有被更新,所以在构建时和构建后比较我的$PATH。

ENV PATH /home/$SETUSER/anaconda3/envs/$CONDA_ENV_NAME/bin:$PATH
ENV PATH /home/$SETUSER/anaconda3/condabin:$PATH
ENV PATH /home/$SETUSER/anaconda3/bin:$PATH
RUN conda init bash
RUN /bin/bash -c "source /home/$SETUSER/.bashrc"
RUN conda activate base

现在,构建时的Docker $PATH和构建后运行容器时交互修改的$PATH是相同的,但是我仍然得到shell没有正确设置的错误。

CommandNotFoundError:您的shell未正确配置为使用“conda activate”。要初始化shell,请运行$condainit。当前支持的shell有:-bash-fish-tcsh-xonsh-zsh-powershell有关更多信息和选项,请参阅“condainit--help”。重要提示:运行“conda init”后,可能需要关闭并重新启动shell。

为什么这不起作用???

我已经看到使用miniconda docker模板可能有解决方法,但我不能使用它。在Docker构建过程中,如何创建和切换蟒蛇环境?谢谢

共有3个答案

辛龙野
2023-03-14

我还没有用英伟达镜像对其进行测试,但多阶段Docker构建应该可以帮助您,这可能看起来像:

# get Miniconda docker image to get a installed conda env; WARNING: That image is Debian based
FROM continuumio/miniconda3:latest AS miniconda


# your Docker commands
FROM nvidia/cuda:10.1-cudnn7-devel-ubuntu16.04

# Set user
ENV SETUSER myuser

RUN useradd -m $SETUSER
USER $SETUSER
WORKDIR /home/$SETUSER


# Miniconda: get necessary files from build
COPY --from=miniconda /opt/conda /opt/conda
# Set correct permissions
RUN chown -R $SETUSER: /opt/conda
#   New terminals will have conda active
# If nvidia's Docker image has no .bashrc
# COPY --from=miniconda /home/$SETUSER/.bashrc
# else
RUN echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc && \
    echo "conda activate base" >> ~/.bashrc

# switch shell sh (default in Linux) to bash
SHELL ["/bin/bash", "-c"]

# give bash access to Anaconda, then normal anaconda commands, e.g. (-q: quiet, -y: answer yes)
RUN source /home/$SETUSER/.bashrc \
 && conda create -q --name testy \
 && conda activate testy \
 && conda install -y your_package

从这个 GitHub 问题中获得的灵感:https://github.com/ContinuumIO/docker-images/issues/89

常子濯
2023-03-14

假设您要安装 conda 环境并在其中运行某些内容,则此方法使用 ENV PATH 在该 conda 环境中间接启动 python。人们可能会想知道这种方法是否真的激活了环境,但只要后续命令有效,而且确实有效,这可能并不重要。

FROM continuumio/miniconda3:latest
WORKDIR myappdir
COPY environment.yml .
RUN set -x && \
#   apt-get update && apt-get -y install gcc && \
    conda install -n base -c defaults conda=4.* && \
    conda env create -n condaenv  # Installs environment.yml && \
    conda clean -a
COPY myapppkg myapppkg
ENV PATH /opt/conda/envs/condaenv/bin:$PATH
ENTRYPOINT ["python", "-m", "myapppkg"]

我建议不要使用conda run,因为它是实验性的,因为有严重的错误历史,比如这个影响它的错误。尽管这个特定的错误现在已经修复,但它持续的“实验”性质,如conda run-h所示,这意味着它可能会再次中断上游,限制人们对它的信任。

供参考:

    < Li > Miniconda Docker标签列表 < li >按渠道列出的conda更新列表:默认值,conda-forge
高运诚
2023-03-14

您的 Docker 文件中有太多的 RUN 命令。这不仅仅是每个 RUN 都会在映像中创建一个新层。此外,每个 RUN 命令都会启动一个新的外壳程序,并且 conda 激活仅适用于当前外壳程序。

您应该将逻辑操作组合并到一个运行命令中。使用<代码>

RUN conda activate <myenv> \
 && conda install <whatever> \
 && ...

请记住:在RUN命令结束时,shell将消失。因此,如果您之后想对conda环境做其他事情,您必须再次运行conda激活,否则使用-n

当您从映像启动容器时,您还必须在容器内调用conda active

 类似资料:
  • 问题内容: 我有Anaconda在系统上工作,而VsCode在工作,但是在运行python脚本时如何使VsCode激活特定环境? 问题答案: 如果Anaconda是您的默认Python安装,则仅在安装Microsoft Python扩展后才可以使用 。 无论Python编辑器是什么,还是需要指向特定的安装,以下内容均应起作用: 在settings.json中使用类似以下内容编辑python.pat

  • 问题内容: 我在Windows 8上,使用Anaconda 1.7.5 64bit。 我创建了一个新的Anaconda环境 来自。 效果很好(有一个带有新python发行版的文件夹)。康达告诉我输入 激活环境,但是返回: 如何激活环境?我究竟做错了什么? 问题答案: 如果发生这种情况,则需要为您的环境设置PATH(以便从环境和Windows上的Scripts \中获取正确的Python)。 假设您

  • 我正在尝试将服务器URL传递给在Docker容器中运行的React应用程序。它在应用程序中发送HTTP请求时使用,访问方式如下:server_url。这在主机上存储为en环境变量。 我尝试过直接在我的does文件中设置变量:< code > ENV server _ URL = $ { server _ URL } ,我认为这不起作用,因为< code>${server_url}是针对does文件

  • 问题内容: 我需要在我们的jenkins服务器(在Windows上运行)上使用特定的conda环境运行jenkins构建。我认为这和运行一样容易: 但这似乎导致构建甚至在脚本启动之前退出。这是jenkins控制台日志: 如果删除激活行,则python脚本可以正常执行。 仅供参考,我正在运行的脚本: 有人知道发生了什么吗?我应该直接调用相关的python可执行文件吗? 问题答案: 使用以防止激活从它

  • 问题内容: 我在bash终端中有一个使用Intel Python Distribution解释器的环境。但是,在导入软件包时,它们是从看起来像系统默认Python的用户目录而非环境的目录中导入的。查看版本差异和包的来源。 使用环境时,不会发生这种情况。包(例如)是从正确的路径导入的: 相关部分(未在路径中显式设置anaconda): 分别为和环境产生这些s : 在我 不 希望进口在这里,所在的位置

  • 问题内容: 我正在创建Django Web应用程序,并使用Conda来管理所需的程序包和虚拟环境。我想在激活环境后立即设置环境变量(Django设置位置)。它还应该将当前目录更改为我的项目目录。 我以前使用virtualenvwrapper,只是将命令添加到了postactivate脚本中。 如何使用Conda实现此目的? 问题答案: 自conda v3.8起(在询问此问题之后),该功能已可用。激