Dockerfile中WORKDIR导致BLAST无法找到挂载数据库的问题解决咨询
问题:AWS Batch中BLAST无法找到挂载的数据库路径
我制作了可在AWS Batch运行的Docker镜像,镜像包含多个层,将文件复制到/opt并设为WORKDIR。需要运行名为BLAST的程序,它需要包含数据库位置在内的多个参数。运行镜像时出现错误,无法找到挂载的数据库路径/mnt/fsx/ntdb/nt,完整错误信息:
b'BLAST Database error: No alias or index file found for nucleotide database [/mnt/fsx/ntdb/nt] in search path [/opt:/fsx/ntdb:] '
排查发现BLAST的搜索路径是/opt:/fsx/ntdb:,这是Dockerfile中WORKDIR设置的路径与通过os.environ['BLASTDB']设置的BLASTDB路径的组合。我的Dockerfile内容如下:
# Set Work dir ARG FUNCTION_DIR="/opt" # Get layers FROM (aws-account).dkr.ecr.(aws-region).amazonaws.com/uclust AS layer_1 FROM (aws-account).dkr.ecr.(aws-region).amazonaws.com/blast AS layer_2 FROM public.ecr.aws/lambda/python:3.9 # Copy arg and set work dir ARG FUNCTION_DIR COPY . ${FUNCTION_DIR} WORKDIR ${FUNCTION_DIR} # Copy from layers COPY --from=layer_1 /opt/ . RUN true COPY --from=layer_2 /opt/ . RUN true COPY . ${FUNCTION_DIR}/ RUN true # Copy and Install required libraries COPY requirements.txt . RUN true RUN pip3 install -r requirements.txt # To run lambda handler RUN pip install \ --target "${FUNCTION_DIR}" \ awslambdaric # To run blast RUN yum -y install libgomp # See files inside image RUN dir -s # Get permissions for files RUN chmod +x /opt/main.py RUN chmod +x /opt/mode/submit/main.py # Set Entrypoint and CMD ENTRYPOINT [ "python3" ] CMD [ "-m", "awslambdaric", "main.lambda_handler" ]
想知道是否需要移除WORKDIR,或者有其他解决办法。
解决方法
- 不需要移除WORKDIR,问题核心是BLASTDB环境变量设置的路径和实际挂载路径不匹配。你当前设置的BLASTDB是
/fsx/ntdb,但数据库实际挂载在/mnt/fsx/ntdb,导致搜索路径里没有正确的挂载目录,BLAST自然找不到数据库文件。 - 修正BLASTDB环境变量,将其设置为
/mnt/fsx/ntdb。可以直接在Dockerfile中添加一行:
这样BLAST的搜索路径会变成ENV BLASTDB="/mnt/fsx/ntdb"/opt:/mnt/fsx/ntdb,就能匹配到实际挂载的数据库位置。 - 另外,确认AWS Batch的挂载配置无误,确保Fsx的挂载路径确实是
/mnt/fsx/ntdb,且该路径下存在完整的BLAST数据库文件(比如nt.nhr、nt.nin、nt.nsq等索引文件)。 - 也可以绕开搜索路径,直接在调用BLAST命令时指定数据库的完整路径,比如:
blastn -db /mnt/fsx/ntdb/nt -query input.fasta
内容的提问来源于stack exchange,提问作者Ludacia
相关产品推荐
相关产品推荐

