Docker构建时conda安装r-base初始求解失败如何解决?
问题描述
执行make build触发Docker构建时,在执行conda install -c conda-forge r-base步骤失败,报错如下:
Step 12/25 : RUN conda install -c conda-forge r-base ---> Running in 828e7f234ed3 Collecting package metadata (current_repodata.json): ...working... done Solving environment: ...working... failed with initial frozen solve. Retrying with flexible solve.
最终构建终止,错误信息:
The command '/bin/sh -c conda install -c conda-forge r-base' returned a non-zero code: 1 make: *** [Makefile:2: build] Error 1
相关Dockerfile和Makefile内容如下:
Dockerfile
FROM continuumio/anaconda3 ENV INSTALL_PATH /environment_name RUN mkdir -p $INSTALL_PATH WORKDIR $INSTALL_PATH #COPY environment.yml environment.yml #RUN conda env create -f environment.yml RUN conda create -n environment_name RUN /opt/conda/bin/activate environment_name #RUN conda config --add channels conda-forge #RUN conda config --set channel_priority strict #RUN conda install r-cairodevice RUN conda install -n environment_name bokeh h5py numpy scipy pandas scikit-learn sphinx spyder jupyter statsmodels RUN conda install -n environment_name -c bioconda pymzml RUN conda install -n environment_name -c bioconda netcdf4 RUN conda install -c conda-forge fonts-conda-forge RUN conda install -c conda-forge r-base RUN conda install -c bioconda bioconductor-ropls RUN pip install flask werkzeug gunicorn RUN conda install seaborn RUN echo "source activate environment_name" > ~/.bashrc ENV PATH /opt/conda/envs/environment_name/bin:$PATH COPY . . RUN chmod +x run_server.sh RUN chmod +x start.sh ADD start.sh / CMD /start.sh RUN conda install -c conda-forge libjpeg-turbo RUN git clone https://bitbucket.org/iAnalytica/mshub_process.git RUN conda install -n environment_name -c bioconda pyteomics #CMD gunicorn -b 0.0.0.0:8000 --access-logfile - "api.app:app"
Makefile
build: docker build -t environment_name .
解决方法
1. 修正conda环境安装目标
Docker的RUN命令是独立shell执行,/opt/conda/bin/activate environment_name仅在当前RUN生效,后续命令默认使用base环境。安装r-base时必须显式指定目标环境,否则会在base环境中安装,与已安装包产生依赖冲突:
RUN conda install -n environment_name -c conda-forge r-base
2. 启用conda-forge通道并设置严格优先级
打开Dockerfile中被注释的通道配置,让conda优先使用conda-forge的包,减少跨通道依赖冲突:
RUN conda config --add channels conda-forge RUN conda config --set channel_priority strict
将这两行放在创建环境之后、安装包之前的位置。
3. 合并conda安装命令
分散的conda install会逐步累积依赖冲突,同时增加镜像图层。将同通道的包合并到一个命令中,还能提升构建效率:
# 合并defaults通道包安装 RUN conda install -y -n environment_name \ bokeh h5py numpy scipy pandas scikit-learn sphinx spyder jupyter statsmodels seaborn # 合并bioconda通道包安装 RUN conda install -y -n environment_name -c bioconda \ pymzml netcdf4 bioconductor-ropls pyteomics # 合并conda-forge通道包安装 RUN conda install -y -n environment_name -c conda-forge \ fonts-conda-forge r-base libjpeg-turbo
添加-y参数自动确认安装,避免构建过程中需要交互。
4. 固定基础镜像版本
continuumio/anaconda3默认拉取最新版,可能存在依赖兼容性问题。指定一个稳定版本,比如:
FROM continuumio/anaconda3:2023.09-0
5. 调整pip安装顺序
将pip安装放在所有conda安装之后,且确保使用目标环境的pip(已通过PATH环境变量配置),避免安装到base环境:
# 先完成conda安装,再执行pip安装 ENV PATH /opt/conda/envs/environment_name/bin:$PATH RUN pip install flask werkzeug gunicorn
完整修改后的Dockerfile示例
FROM continuumio/anaconda3:2023.09-0 ENV INSTALL_PATH /environment_name RUN mkdir -p $INSTALL_PATH WORKDIR $INSTALL_PATH # 创建conda环境并配置通道 RUN conda create -y -n environment_name RUN conda config --add channels conda-forge RUN conda config --set channel_priority strict # 批量安装各类包 RUN conda install -y -n environment_name \ bokeh h5py numpy scipy pandas scikit-learn sphinx spyder jupyter statsmodels seaborn RUN conda install -y -n environment_name -c bioconda \ pymzml netcdf4 bioconductor-ropls pyteomics RUN conda install -y -n environment_name -c conda-forge \ fonts-conda-forge r-base libjpeg-turbo # 配置环境变量并执行pip安装 ENV PATH /opt/conda/envs/environment_name/bin:$PATH RUN pip install flask werkzeug gunicorn # 后续文件操作 COPY . . RUN chmod +x run_server.sh RUN chmod +x start.sh ADD start.sh / RUN git clone https://bitbucket.org/iAnalytica/mshub_process.git RUN echo "source activate environment_name" > ~/.bashrc CMD /start.sh
内容的提问来源于stack exchange,提问作者anaclc
相关产品推荐
相关产品推荐

