相关文章推荐
无聊的松球  ·  error: ...·  1 月前    · 
爱跑步的香蕉  ·  react17+18 中 ...·  10 月前    · 
快乐的高山  ·  Docker技术入门与实战 ...·  2 年前    · 
我创建了环境,但后来我试图激活这个环境并以这种方式运行命令。

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

This is the whole 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" ]
    
5 个评论
请向我们展示你的Docker文件;看起来你并没有真正建立起mro_env的环境。也请查看正式文件 for the CMD instruction.
@JordanSinger 我添加了Docker文件
你确定你的环境创建成功了吗?
@FabienP 是的,环境安装成功了。问题是与jupyter笔记本的整合。我的目标是在jupyter上安装环境,然后用这个环境启动jupyter。你有什么办法让我做到这一点吗?
我的方法通常是在环境中安装Jupyter,然后从那里启动它。否则你可以看一下nb_conda_kernels来从你的Jupyter服务器到达这个环境。
python
docker
anaconda
conda
Yahav Festinger
Yahav Festinger
发布于 2019-03-12
13 个回答
SadSeven
SadSeven
发布于 2022-02-18
已采纳
0 人赞同

Followed this 教程并且成功了。示例Docker文件。

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"]

如果你使用4.9版本的conda,你可以使用 "conda run --no-capture-output "来不缓冲IO。更新了Docker文件。

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", "--no-capture-output", "-n", "myenv", "/bin/bash", "-c"]
EXPOSE 5003
# The code to run when container is started:
ENTRYPOINT ["conda", "run", "--no-capture-output", "-n", "myenv", "python3", "src/server.py"]
    
你在这里提到的教程(以及整个网站)值得花每一分钟来阅读。谢谢你。
SHELL命令不起作用,使我的其他代码认为它在引号中。
merv
据我所知,conda run会缓冲所有的标准输出/错误,直到进程结束,所以对于通过标准I/O进行交互的应用程序来说,这不是一个选项。我想它仍然可以运行一个服务器,但不要指望在它运行时监控任何stderr信息。另外,那个 "教程 "也有问题,比如第一个例子之所以失败,是因为作者没有在一个RUN中正确地链接他们的命令(即,使用&&),而且不必要地运行conda init,当基础图像已经做了这个设置。
Docker的什么东西如此短暂,以至于命令需要像这样连锁起来
@merv 如果你使用4.9版本的conda,你可以使用 "conda run --no-capture-output "来不缓冲IO。
Serge K
Serge K
发布于 2022-02-18
0 人赞同

你可以设置CONDA_DEFAULT_ENV

Like this:

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" ]
    
在conda env的bin前面加上预置可以工作,不知道CONDA_DEFAULt_ENV在这里的作用是什么。而且这可能会弄乱conda activate,因为你没有把其他变量定义为CONDA_SHLVL等等。
我的问题是用这个环境启动jupyter。你是否知道如何在jupyter上安装环境,然后用环境启动它?
指定/bin/bash -c "source activate mro_env"似乎完全没有意义,因为后面的ENTRYPOINT和/或CMD的活动外壳不是bash;它显然是sh。设置CONDA_DEFAULT_ENV似乎也同样是毫无意义的。在这两种情况下,真正的工作是由ENV PATH完成的。
当使用docker时,我们是否每次创建容器时都要创建一个新的conda环境?还是只在创建docker镜像时创建一次?
I've seen ppl do something like this in the docker file: RUN conda create -n pycoq python=3.9 -y then ENV PATH="/home/bot/miniconda3/envs/pycoq/bin:${PATH}". Is there something wrong with this?
chAlexey
chAlexey
发布于 2022-02-18
0 人赞同

For me, the solution introduced here worked seemlessly:

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
    
gstricker
gstricker
发布于 2022-02-18
0 人赞同

正如用户merv在上面的一条评论中指出的那样(对不起,我没有足够的回复来给这条评论投票)conda run缓冲了所有的stdout/stderr,因此使得它不能用于应用程序的交互,甚至只是通过I/O显示日志。

我注意到没有公认的答案,所以我只是贴出对我非常有效的方法。

你可以使用一个入口脚本来激活conda环境,并让它从Docker文件中接管进一步的输入,这样就可以在激活的conda环境中执行python脚本了。

示例Docker文件。

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"]

Where the entrypoint.sh looks like this:

#!/bin/bash --login
set -e
# activate conda environment and let the following process take over
conda activate myenv
exec "$@"

所有功劳归于David R. Pugh,来自this post有更多细节,特别是关于Jupyter的细节。

当使用docker时,我们是否每次创建容器时都要创建一个新的conda环境?还是只在创建docker镜像时创建一次?
I've seen ppl do something like this in the docker file: RUN conda create -n pycoq python=3.9 -y then ENV PATH="/home/bot/miniconda3/envs/pycoq/bin:${PATH}". Is there something wrong with this?
HolyGuacamole
HolyGuacamole
发布于 2022-02-18
0 人赞同

下面是如何在conda环境下运行一个脚本的方法without缓冲所有标准输入/输出。

从conda 4.9版本开始,--no-capture-output选项可用。

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"]
    
CiaranWelsh
CiaranWelsh
发布于 2022-02-18
0 人赞同

我的问题是,在安装之后在docker里面运行conda activate env命令,导致conda要求我使用conda init bash命令。然而,这个命令要求你重启shell,而我们不想在docker里面这么做。因此,解决方案是认识到,conda之所以要求你重启shell,是因为它修改了并想重新加载~/.bashrc的内容。我们可以手动完成这个工作,并放弃重启shell的需要,使用。

. ~/.bashrc

下面是完整的docker文件,供需要的人参考。

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

Edit - deal with comment

评论者是正确的,上面的例子对在docker内切换conda环境不起作用。最近,我想明白了,要想让这个东西起作用,你应该在每个RUN命令的开头都加上conda init bash && .~/.bashrc && conda activate env

下面是另一个例子。

FROM quay.io/pypa/manylinux2014_x86_64 RUN yum install -y wget RUN wget https://repo.anaconda.com/miniconda/Miniconda3-py39_4.9.2-Linux-x86_64.sh RUN bash Miniconda3-py39_4.9.2-Linux-x86_64.sh -b -p /Miniconda3 RUN /Miniconda3/bin/conda create -y --name py37 python=3.7 pytest RUN /Miniconda3/bin/conda create -y --name py38 python=3.8 pytest RUN /Miniconda3/bin/conda create -y --name py39 python=3.9 pytest RUN /Miniconda3/bin/conda init && bash ~/.bashrc && . ~/.bashrc ENV conda /Miniconda3/bin/conda ENV bashrc /root/.bashrc # install numpy in each env RUN $conda init && . $bashrc && conda activate py37 && pip install numpy RUN $conda init && . $bashrc && conda activate py38 && pip install numpy RUN $conda init && . $bashrc && conda activate py39 && pip install numpy
如果你需要在一个容器中的不同环境之间切换,这不是一个有效的解决方案。
@Jeremy Leipzig是正确的。为了在后续的RUN命令中切换conda环境,你需要在每个RUN命令中以conda init && . ~/.bashrc && conda activate py38(例如)开始。
avaj_wen12
avaj_wen12
发布于 2022-02-18
0 人赞同

我知道没有一种解决方案适合所有人,但这是我在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启动应用程序,指向环境。

This is the project directory structure I used with the Dockerfile:

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

注意,这本身并没有激活环境,而是在运行时在CMD命令中指向它

Neelotpal Shukla
Neelotpal Shukla
发布于 2022-02-18
0 人赞同

我在试图激活一个环境,然后在里面安装一些软件包时偶然发现了这个问题。SHELL方案对我来说并不奏效(也许是因为我是在旧版本的conda上尝试的--准确地说,是4.5.4)。

解决办法是激活环境,在一个新的shell中运行所有需要的命令。另外,请记住,每次RUN都会启动一个新的shell,它不会记住前一次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的""内。

Deep Patel
Deep Patel
发布于 2022-02-18
0 人赞同

与其他答案类似,但有SHELL,看起来更干净。

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}
    
Soren
Soren
发布于 2022-02-18
0 人赞同

要想让它可靠地工作,是相当无望的。有时一个解决方案在一个系统上工作了一段时间,然后突然停止工作。现在continuum/minicoda3的创造者也几乎没有对这个问题的支持。我猜,因为他们打算让容器的使用方式不同。我尝试了下面的方法,它可以运行,但是,当试图用docker-compose运行容器时,它在一个奇怪的位置/opt/conda/envs/而不是/root/miniconda3/envs/寻找环境。

FROM ubuntu:22.04
ENV PATH="/root/miniconda3/bin:${PATH}"
ARG PATH="/root/miniconda3/bin:${PATH}"
RUN apt-get update
RUN apt-get install -y wget build-essential time && rm -rf /var/lib/apt/lists/*
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 
RUN conda --version
RUN conda init bash
RUN conda create -n myenv -c conda-forge -c bioconda python==3.10 pip
SHELL ["conda", "run", "-n", "myenv", "/bin/bash", "-c"]
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
    
dashesy
dashesy
发布于 2022-02-18
0 人赞同

当我运行一个容器时,我用它来激活一个环境。为了在该环境中安装软件包,我只需使用"-n myenv"。

ENV PATH /opt/miniconda/bin:${PATH}
RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-4.5.11-Linux-x86_64.sh -O ~/miniconda.sh --no-check-certificate && /bin/bash ~/miniconda.sh -b -p /opt/miniconda
RUN rm ~/miniconda.sh
RUN conda clean -ya
RUN conda update -n base -c defaults conda
RUN conda create --name detic python=3.8 -y
RUN echo ". /opt/miniconda/etc/profile.d/conda.sh" >> ~/.bashrc
RUN echo "conda activate detic" >> ~/.bashrc
RUN conda install -n detic ipython

我不喜欢改变入口点

grofte
grofte
发布于 2022-02-18
0 人赞同

如果你不需要在远离基地的地方改变环境,你也可以这样做。

COPY conda.yaml /
RUN { echo "name: base"; tail +2 /conda.yaml; } > /base.yaml
RUN conda env update --file /base.yaml --prune

替换代码1】中的环境可以有任何名称,因为我们用基数替换它。

Abhishek Vats
Abhishek Vats
发布于 2022-02-18
0 人赞同

由于conda运行是一个实验性的功能,正确的方法是在你的Docker文件中添加这一行

SHELL [ "/bin/bash", "--login", "-c" ]

在这之后,你可以继续使用