首页 > 解决方案 > 在 Docker 中配置/设置/激活 Python Conda 环境

问题描述

我正在尝试在 docker 容器中设置 conda 环境,但它总是在 dockerfile 中的环境创建阶段失败并出现错误: 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" ]

标签: pythondockeranaconda

解决方案


终于想通了:

要创建具有相应依赖项(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"]






推荐阅读