在Docker中配置/设置/激活Python Conda环境

2024-05-20 19:36:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在docker容器中设置conda环境,但在docker文件中的环境创建阶段,它总是失败,错误如下: conda activate" fails because shell is not initialized

下面是我的Dockerfile:

FROM pytorch/pytorch:1.1.0-cuda10.0-cudnn7.5-runtime

WORKDIR /app

# SET BASH AS CURRENT SHELL
RUN chsh -s /bin/bash
SHELL ["/bin/bash", "-c"]

# INSTALL ANACONDA
RUN apt-get update -y

RUN apt-get install -y wget && \
    apt-get clean


RUN rm -rf /opt/conda && \
    wget --quiet https://repo.anaconda.com/archive/Anaconda3-2020.11-Linux-x86_64.sh -O ~/anaconda.sh && \
    /bin/bash ~/anaconda.sh -b -p /opt/conda && \
    rm ~/anaconda.sh && \
    ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh && \
    echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc && \
    find /opt/conda/ -follow -type f -name '*.a' -delete && \
    find /opt/conda/ -follow -type f -name '*.js.map' -delete && \
    /opt/conda/bin/conda clean -afy

COPY ./requirements.yml /tmp/requirements.yml


RUN conda update conda \
    && conda env create -f /tmp/requirements3.yml

RUN echo "conda activate nib_docker" >> ~/.bashrc
ENV PATH /opt/conda/envs/nib_docker/bin:$PATH
ENV CONDA_DEFAULT_ENV $nib_docker

COPY . .
CMD [ "python", "-u", "train.py" ]

Tags: dockerrunenvbashgetbinymlsh
1条回答
网友
1楼 · 发布于 2024-05-20 19:36:07

最后得出结论:

要创建具有相应依赖项(conda和pip)的docker环境,可以执行以下步骤:

创建YML文件

创建yml文件,其中列出conda环境详细信息(conda和pip)。您可以使用以下命令将本地计算机中的现有conda环境导出到yml文件 在这里,我将在激活myconda环境后导出它

conda activate myconda
conda env export  no-builds > env_config.yml
#  no-builds  > added to make sure that the build versions are not part of the final yml file as the build versions differ based on your base OS (Linux, Windows,macOS).

YML文件如下所示:

name: myconda #rename this if you want to change the name of enviroment in docker
channels:
  - pytorch
  - conda-forge
  - defaults
dependencies:
  - pip
  - conda_package1=4.0
  - conda_package2=5.0
  - conda_package3=6.0
  - pip:
    - pip_package1==6.0
    - pip_package2==7.0
    - pip_package3==8.0
    
prefix: C:\Users\ABC\.conda\envs\myconda

我更喜欢将我的conda和pip依赖项分为两个独立的文件,这样,如果我想更改任何依赖项,我只会更改相应的文件,以避免在创建docker映像时再次下载所有包。 因此,编辑后,这两个文件现在将如下所示:

env_config.yml

channels:
  - pytorch
  - conda-forge
  - defaults
dependencies:
  - pip
  - conda_package1=4.0
  - conda_package2=5.0
  - conda_package3=6.0
    
# prefix: C:\Users\ABC\.conda\envs\myconda  # not needed

env_pip_config.txt

pip_package1==6.0
pip_package2==7.0
pip_package3==8.0

最后,Dockerfile:

Dockerfile

## BASE IMAGE
FROM python:3.8

## SET WORKING DIRECTORY
WORKDIR /app

RUN apt-get update -y \
    && apt-get install -y wget \
    && apt-get clean
    
## CONDA INSTALLATION  > use the latest Anaconda version for linux from their official website. Google it buddy.
RUN rm -rf /opt/conda && \
    wget  quiet https://repo.anaconda.com/archive/Anaconda3-2020.11-Linux-x86_64.sh -O ~/anaconda.sh && \
    /bin/bash ~/anaconda.sh -b -p /opt/conda && \
    rm ~/anaconda.sh && \
    ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh && \
    echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc && \
    find /opt/conda/ -follow -type f -name '*.a' -delete && \
    find /opt/conda/ -follow -type f -name '*.js.map' -delete && \
    /opt/conda/bin/conda clean -afy
    
## ADD CONDA PATH TO LINUX PATH 
ENV PATH /opt/conda/bin:$PATH

## COPY ENV REQUIREMENTS FILES
COPY ./env_config.yml /tmp/env_config.yml
COPY ./env_pip_config.txt /tmp/env_pip_config.txt

## CREATE CONDA ENVIRONMENT USING YML FILE
RUN conda update conda \
    && conda env create -f /tmp/env_config.yml
    
## ADD CONDA ENV PATH TO LINUX PATH 
ENV PATH /opt/conda/envs/myconda/bin:$PATH
ENV CONDA_DEFAULT_ENV myconda
# make sure to put your env name in place of myconda

## MAKE ALL BELOW RUN COMMANDS USE THE NEW CONDA ENVIRONMENT
SHELL ["conda", "run", "-n", "myconda", "/bin/bash", "-c"]

## INSTALL PIP DEPENDENCIES
RUN pip install -r /tmp/env_pip_config.txt

## COPY REST OF THE FILES
COPY . .

## FINALLY TIME TO EXECUTE!
CMD ["python", "myscript.py"]





相关问题 更多 >