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

时间:2019-06-08 22:29:49

标签: python docker anaconda dockerfile

我已经尝试了几个小时,无法弄清在构建过程中如何在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环境?谢谢!

3 个答案:

答案 0 :(得分:2)

您的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

答案 1 :(得分:0)

假设您要在conda环境中运行某些命令,conda run命令是否可以为您工作,如下所示?它适合我在特定的conda环境中启动Python进程:

FROM continuumio/miniconda3:latest
# RUN apt-get update && apt-get -y install gcc  # For compiling a pkg like "regex"
WORKDIR myappdir
COPY environment.yml .
RUN conda update -n base -c defaults conda setuptools && \
    conda env create -n mycondaenv  # Installs environment.yml
COPY myapppkg myapppkg
ENTRYPOINT ["conda", "run", "-n", "mycondaenv", "python", "-m", "myapppkg"]

请注意,conda run截至本答案发布之日尚处于试验阶段。要获得使用帮助,请使用conda run --help

答案 2 :(得分:0)

我还没有使用nvidia图像对其进行测试,但是multi-stage Docker builds应该可以为您提供帮助,看起来可能像这样:

# 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