Docker环境安装R包clusterProfiler失败:libxml/globals.h缺失
Docker化Jupyter-R环境安装clusterProfiler失败:igraph编译找不到libxml头文件
环境配置
文件结构
Jupyter-R/ ├── jupyter-r/ │ ├── docker-compose.yml │ └── Dockerfile └── notebooks/
docker-compose.yml
version: '3' services: jupyter: build: context: .. dockerfile: ./jupyter-r/Dockerfile ports: - "8888:8888" volumes: - ../notebooks:/app/notebooks # Mount a local folder to store notebooks environment: - TZ=UTC+1 # Set the container timezone image: jupyter_r container_name: jupyter_r
Dockerfile(精简版)
# Use the jupyter/r-notebook image as the base FROM quay.io/jupyter/r-notebook # Set the working directory to /app WORKDIR /app # Switch to the root user USER root # Install system dependencies RUN apt-get update RUN apt-get install -y --fix-missing \ libssl-dev \ libcurl4-openssl-dev \ libxml2-dev \ glpk-utils \ libfontconfig1-dev \ libharfbuzz-dev \ libfribidi-dev \ libproj-dev \ libglpk-dev \ libfreetype6-dev \ libpng-dev \ libtiff5-dev \ libjpeg-dev \ mono-mcs \ mono-xbuild \ mono-runtime \ libmono-system-data4.0-cil # Install R packages RUN mamba install --yes \ 'r-BiocManager' # Install BiocManager packages RUN R -e "BiocManager::install(c(\ 'clusterProfiler',\ 'AnnotationDbi',\ 'org.Hs.eg.db'\ ))" # Expose the Jupyter Notebook port EXPOSE 8888 # Create JupyterLab configuration directory RUN mkdir -p /etc/jupyter # Add JupyterLab configuration to save notebooks in /app/notebooks RUN echo "c.NotebookApp.notebook_dir = '/app/notebooks'" >> /etc/jupyter/jupyter_lab_config.py RUN echo "c.MappingKernelManager.kernel_cmd_timeout = 3600" >> /home/jovyan/.jupyter/jupyter_notebook_config.py # Command to run Jupyter Notebook CMD ["jupyter", "lab", "--ip=0.0.0.0", "--port=8888", "--no-browser", "--allow-root"]
问题详情
执行docker-compose up --build后镜像构建完成且容器可启动,但调用installed.packages()发现clusterProfiler未安装。查看构建日志发现,clusterProfiler依赖的enrichplot、ggraph、tidygraph均因igraph安装失败无法安装,igraph编译时错误如下:
#9 174.1 vendor/cigraph/src/io/graphml.c:46:10: fatal error: libxml/globals.h: No such file or directory #9 174.1 46 | #include <libxml/globals.h> #9 174.1 | ^~~~~~~~~~~~~~~~~~ #9 174.1 compilation terminated. #9 174.1 make: *** [/opt/conda/lib/R/etc/Makeconf:193: vendor/cigraph/src/io/graphml.o] Error 1 #9 174.1 ERROR: compilation failed for package ‘igraph’ #9 174.1 * removing ‘/opt/conda/lib/R/library/igraph’ #9 174.1 * restoring previous ‘/opt/conda/lib/R/library/igraph’
已确认libxml2-dev已安装,且globals.h存在于容器的/opt/conda/include/libxml2/libxml路径下,但问题仍未解决。
解决方案
1. 移除系统版igraph避免冲突
删除Dockerfile中apt-get install列表里的r-cran-igraph,系统预装的igraph版本会和conda环境下的版本冲突,导致编译路径混乱。
2. 指定libxml2头文件路径
在安装BiocManager包的命令前,设置CPPFLAGS环境变量,让编译器找到conda环境下的libxml2头文件:
修改Dockerfile中的安装命令为:
# Install BiocManager packages with correct header path RUN export CPPFLAGS="-I/opt/conda/include/libxml2" && R -e "BiocManager::install(c(\ 'clusterProfiler',\ 'AnnotationDbi',\ 'org.Hs.eg.db'\ ), dependencies=TRUE)"
或者全局设置环境变量(更持久):
# Set environment variable to locate libxml2 headers ENV CPPFLAGS="-I/opt/conda/include/libxml2" # Install BiocManager packages RUN R -e "BiocManager::install(c(\ 'clusterProfiler',\ 'AnnotationDbi',\ 'org.Hs.eg.db'\ ), dependencies=TRUE)"
3. 可选:用mamba安装igraph
如果上述方法仍有问题,可先通过mamba安装igraph,再安装clusterProfiler:
# Install igraph via mamba first to avoid compilation issues RUN mamba install --yes 'r-igraph' # Install BiocManager packages RUN R -e "BiocManager::install(c(\ 'clusterProfiler',\ 'AnnotationDbi',\ 'org.Hs.eg.db'\ ))"
原因说明
igraph编译时默认查找系统标准路径下的libxml2头文件,但conda环境将libxml2安装在了/opt/conda/include/libxml2,编译器无法自动识别这个路径,需要通过CPPFLAGS手动指定。同时系统版igraph和conda环境的R包存在依赖冲突,移除后可避免路径干扰。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

