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

Shr*_*sai 0 python docker anaconda

我正在尝试在 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" ]
Run Code Online (Sandbox Code Playgroud)

Shr*_*sai 5

终于弄清楚了:

要创建 docker 环境及其相应的依赖项(conda 和 pip),可以按照以下步骤操作:

创建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).
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我更喜欢将 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
Run Code Online (Sandbox Code Playgroud)

env_pip_config.txt

pip_package1==6.0
pip_package2==7.0
pip_package3==8.0
Run Code Online (Sandbox Code Playgroud)

最后是 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-2023.01-0-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


## Henceforth use your env name instead of "myconda" below

## ADD CONDA ENV PATH TO LINUX PATH 
ENV PATH /opt/conda/envs/myconda/bin:$PATH
ENV CONDA_DEFAULT_ENV myconda

## MAKE ALL BELOW RUN COMMANDS USE THE NEW CONDA ENVIRONMENT
RUN echo "conda activate poppy" >> ~/.bashrc


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





Run Code Online (Sandbox Code Playgroud)