WDL调用内置conda环境的Docker镜像时报依赖缺失如何解决
问题根因
Cromwell运行Docker容器时会自动覆盖镜像定义的ENTRYPOINT,你原来通过ENTRYPOINT ["conda", "run", "--no-capture-output", "-n", "myenv"]自动激活环境的逻辑在WDL场景下完全不生效,command里直接执行python调用的是miniconda默认base环境的python,而numpy只装在你创建的myenv环境里,所以触发模块找不到的报错。
修复方案
方案1:修改Dockerfile,将myenv设为默认激活环境(推荐)
不需要调整原有WDL代码,一劳永逸,修改后的Dockerfile如下:
FROM continuumio/miniconda3 WORKDIR /app # 创建conda环境 COPY environment.yml . RUN conda env create -f environment.yml # 把myenv的bin目录加到PATH最前面,保证调用python等命令优先用myenv里的版本 ENV PATH /opt/conda/envs/myenv/bin:$PATH COPY test.py . # 原有SHELL和ENTRYPOINT配置可删可留,不影响WDL场景运行
改完重新构建推送镜像即可,WDL不用做任何修改就能正常运行。
方案2:不修改Docker镜像,直接调整WDL的command块
如果不方便重新构建镜像,可以直接在WDL命令里显式激活环境再执行代码:
command { set -exo pipefail # 显式激活myenv环境 source activate myenv python /app/test.py }
也可以直接调用conda run执行命令:
command { set -exo pipefail conda run --no-capture-output -n myenv python /app/test.py }
内容的提问来源于stack exchange,提问作者Manish
相关产品推荐
相关产品推荐

