我需要在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" ]
答案 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"]