在Docker中激活conda环境

时间:2019-03-12 14:15:38

标签: python docker anaconda conda

我需要在docker中激活环境并在此环境中运行命令。 我创建了环境,但是随后尝试激活该环境并以这种方式运行命令:

CMD [ "source activate mro_env && ipython kernel install --user --name=mro_env" ]

但是当我运行docker时出现错误:

[FATAL tini (8)] exec source activate mro_env && ipython kernel install 
--user --name=mro_env failed: No such file or directory

这是整个Dockerfile:

FROM continuumio/miniconda3

ADD /src/mro_env.yml /src/mro_env.yml
RUN conda env create -f /src/mro_env.yml

# Pull the environment name out of the mro_env.yml
RUN echo "source activate $(head -1 /src/mro_env.yml | cut -d' ' -f2)" > ~/.bashrc
ENV PATH /opt/conda/envs/$(head -1 /src/mro_env.yml | cut -d' ' -f2)/bin:$PATH

CMD [ "source activate mro_env && ipython kernel install --user --name=mro_env" ]

9 个答案:

答案 0 :(得分:7)

遵循此tutorial并成功。 Dockerfile示例:

FROM continuumio/miniconda
WORKDIR /usr/src/app
COPY ./ ./
RUN conda env create -f environment.yml

# Make RUN commands use the new environment:
SHELL ["conda", "run", "-n", "myenv", "/bin/bash", "-c"]

EXPOSE 5003
# The code to run when container is started:
ENTRYPOINT ["conda", "run", "-n", "myenv", "python3", "src/server.py"]

答案 1 :(得分:4)

对我来说,问题是安装后在docker内部运行命令conda activate env导致conda要求我使用conda init bash命令。但是,此命令要求您重新启动外壳程序,而我们不想在docker中执行此操作。因此,解决方案是意识到conda要求您重新启动Shell的原因是因为它已修改并想重新加载~/.bashrc的内容。我们可以手动执行此操作,并且无需使用以下命令重新启动Shell:

. ~/.bashrc

这是所有想要的人的完整dockerfile:

FROM ubuntu:18.04
# update apt and get miniconda
RUN apt-get update \
    && apt-get install -y wget \
    && wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh


# install miniconda
ENV PATH="/root/miniconda3/bin:$PATH"
RUN mkdir /root/.conda && bash Miniconda3-latest-Linux-x86_64.sh -b

# create conda environment
RUN conda init bash \
    && . ~/.bashrc \
    && conda create --name test-env python=3.7 \
    && conda activate test-env \
    && pip install ipython

答案 2 :(得分:3)

类似于其他答案,但外壳看起来更干净

RUN wget \
https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \
&& mkdir /root/.conda \
&& bash Miniconda3-latest-Linux-x86_64.sh -b \
&& rm -f Miniconda3-latest-Linux-x86_64.sh \
&& echo "source activate base" > ~/.bashrc

SHELL ["/bin/bash", "-c"]
ARG CONDA_ENV=env_name 
# Create env
RUN conda --version \
  && conda create -n ${CONDA_ENV} python=3.7 \
  && source activate ${CONDA_ENV}

答案 3 :(得分:3)

我知道没有一种解决方案能适合所有情况,但这是我在Flask应用程序中一直使用的解决方案:

FROM continuumio/miniconda3

COPY environment.yml .
RUN conda env create -f environment.yml

COPY app /app
WORKDIR /app

CMD ["conda", "run", "-n", "my_env", "python", "app.py"]

逻辑很简单。首先,复制环境文件,然后创建环境。接下来,复制应用程序文件(这是我所有Flask应用程序文件所在的位置),并使用CMD通过指向相应的环境来启动应用程序。

这是我与Dockerfile一起使用的项目目录结构:

-- project
    -- app
        -- app.py
    -- environment.yaml
    -- Dockerfile

答案 4 :(得分:2)

在尝试激活环境然后在其中安装一些软件包时,我偶然发现了这个问题。 SHELL解决方案对我不起作用(也许是因为我正在使用较旧版本的conda-准确地说是4.5.4)。

解决方案是激活环境并在新的shell中运行所有必需的命令。另外,请记住,每个RUN都会启动一个新的外壳程序,该外壳程序将不会记住以前的RUN中的任何内容。

FROM continuumio/miniconda3

ADD /src/environment.yml /src/environment.yml

RUN conda env create -f /src/environment.yml
ENV PATH /opt/conda/envs/mro_env/bin:$PATH
RUN /bin/bash -c "source activate mro_env \
    && conda config --add channels conda-forge \
    && conda install Jupiter \
    && conda env list"

CMD [ "python", "test.py" ]

请注意,每个命令都在同一/ bin / bash -c的“”中。

答案 5 :(得分:2)

对我来说,引入here的解决方案效果不佳:

FROM continuumio/miniconda3
RUN conda create -n env python=3.6
RUN echo "source activate env" > ~/.bashrc
ENV PATH /opt/conda/envs/env/bin:$PATH

答案 6 :(得分:1)

正如用户在上面的注释之一中指出的那样(很抱歉,没有足够的代表来对注释进行投票),conda run会缓冲所有stdout / stderr,从而使其不适用于交互的应用程序,甚至无法使用只是通过I / O显示日志。

我注意到没有被接受的答案,所以我只发布对我来说非常有效的内容:

您可以使用入口点脚本来激活conda环境,并让其接管Dockerfile的进一步输入,以便可以在激活的conda环境中执行python脚本

Dockerfile示例:

FROM continuumio/miniconda3

# make docker use bash instead of sh
SHELL ["/bin/bash", "--login", "-c"]

# copy all necessary files
COPY environment.yml .
COPY ownchain/mypyscript.py .
COPY entrypoint.sh /usr/local/bin/

# make entrypoint script executable
RUN chmod u+x /usr/local/bin/entrypoint.sh
# create environment
RUN conda env create -f environment.yml

ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
CMD ["python", "mypyscript.py"]

entrypoint.sh如下所示:

#!/bin/bash --login
set -e

# activate conda environment and let the following process take over
conda activate myenv
exec "$@"

this post对David R. Pugh的所有感谢,其中提供了更多详细信息,尤其是有关Jupyter的信息。

答案 7 :(得分:0)

您可以设置CONDA_DEFAULT_ENV

赞:

FROM continuumio/miniconda3

ARG conda_env=mro_env

ADD /src/environment.yml /src/environment.yml
RUN conda env create -f /src/environment.yml

ENV PATH /opt/conda/envs/$conda_env/bin:$PATH
ENV CONDA_DEFAULT_ENV $conda_env

CMD [ "python", "test.py" ]

更新:

最好使用激活。为我工作:

FROM continuumio/miniconda3

ADD /src/environment.yml /src/environment.yml

RUN conda env create -f /src/environment.yml
ENV PATH /opt/conda/envs/mro_env/bin:$PATH
RUN /bin/bash -c "source activate mro_env"

CMD [ "python", "test.py" ]

答案 8 :(得分:0)

这是在conda环境中运行脚本的方法, 没有 缓冲所有标准输入/输出。

--no-capture-output选项自conda 4.9版开始可用。

FROM continuumio/miniconda3

COPY ./environment.yml ./environment.yml

RUN conda env create && conda clean --all -f --yes

ENTRYPOINT ["conda", "run", "--no-capture-output", "-n", "the_environment_name", "python", "myscript.py"]