python - 在 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" ]
解决方案
终于想通了:
要创建具有相应依赖项(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"]
推荐阅读
- javascript - 一个关于道具的javascript reactjs问题
- android - 不知道位置时的 notifyItemInserted 和 notifyItemRangeInserted
- samsung-mobile - J7 Prime SamsungExperienceServices 不断停止
- python - 使用来自两个数据帧的信息更新空数据帧的更快方法
- ietf-netmod-yang - 来自 pyang confd 的配置或操作数据
- php - 与 Gatsby 的 PHP 联系表
- python - 在短时间内求解包含积分表达式的方程
- python - Python Socket 服务器和并行定时任务
- reactjs - 带有嵌套在抽屉中的选项卡的 React Navigation v5
- groovy - 从 Groovy 中的子类调用父 trait 方法