在构建过程中在Dockerfile中激活和切换Anaconda环境 [英] Activate and switch Anaconda environment in Dockerfile during build

查看:796
本文介绍了在构建过程中在Dockerfile中激活和切换Anaconda环境的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经尝试了好几个小时,却无法弄清楚在构建过程中如何在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将抱怨外壳设置不正确,因此在conda create命令之后,我添加了:

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:您的外壳尚未正确配置为使用"conda activate". 要初始化您的shell,请运行 $ conda初始化 当前支持的外壳程序有: -重击 - 鱼 -tcsh -xonsh -zsh - 电源外壳 有关更多信息和选项,请参见"conda init --help". 重要提示:运行"conda init"后,您可能需要关闭并重新启动Shell.

为什么这不起作用?

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

解决方案

您的Dockerfile中有太多RUN命令.不仅仅是每个RUN在映像中创建一个新层.同样,每个RUN命令都会启动一个新的shell,而conda activate仅适用于当前shell.

您应该将动作的逻辑组组合成一个RUN命令.使用&&组合命令,使用\换行以提高可读性:

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

请记住:在该RUN命令的结尾,shell将消失.因此,如果您想在之后的conda环境中执行其他操作,则必须再次运行conda activate,或者使用-n <myenv>将某些内容放入环境中而无需先激活它.

从图像启动容器时,还必须在容器内调用conda activate.

I've been trying for hours and can't figure out how to activate and switch anaconda environments in a Dockerfile during the build process

Here's the initial code:

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

At first, anaconda in Docker will complain that the shell is not setup properly, so after the conda create command I added:

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

Running the 3 commands after building the docker image works (i.e. running interactively after calling docker run container-name), but for some reason it does not work when building the container. I figured out that the $PATH variable was not being updated during the build, so comparing my $PATH when building and after building.

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

Now, the Docker $PATH when building and the $PATH when modified interactively when running the container after-building is the same, but I'm still getting the shell not properly setup error.

CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'. To initialize your shell, run $ conda init Currently supported shells are: - bash - fish - tcsh - xonsh - zsh - powershell See 'conda init --help' for more information and options. IMPORTANT: You may need to close and restart your shell after running 'conda init'.

Why is this not working???

I've seen that there may be workaround using a miniconda docker template, but I cannot use that. How do I create and switch anaconda environment during the Docker building process? Thanks!

解决方案

You've got way too many RUN commands in your Dockerfile. It's not just that each RUN creates a new layer in the image. It's also that each RUN command starts a new shell, and conda activate applies only to the current shell.

You should combine logical groups of actions into a single RUN command. Use && to combine commands, and \ to break lines for readability:

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

Keep in mind: at the end of that RUN command, the shell will be gone. So if you want to do something else to that conda environment afterwards, you've got to run conda activate again, or else use -n <myenv> to put something into an environment without activating it first.

When you start a container from the image, you will also have to call conda activate inside the container.

这篇关于在构建过程中在Dockerfile中激活和切换Anaconda环境的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆