我创建了环境,但后来我试图激活这个环境并以这种方式运行命令。
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" ]
13 个回答
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"]
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" ]
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
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的细节。
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"]
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
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命令中指向它
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的""内。
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}
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
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
我不喜欢改变入口点
0 人赞同
如果你不需要在远离基地的地方改变环境,你也可以这样做。
COPY conda.yaml /
RUN { echo "name: base"; tail +2 /conda.yaml; } > /base.yaml
RUN conda env update --file /base.yaml --prune
替换代码1】中的环境可以有任何名称,因为我们用基数替换它。
0 人赞同
由于conda运行是一个实验性的功能,正确的方法是在你的Docker文件中添加这一行
SHELL [ "/bin/bash", "--login", "-c" ]
在这之后,你可以继续使用