我创建了Dockerfile,用于生成可从AWS批处理运行的Docker映像,包含多个层,将文件复制到'/opt',并将其设置为WORKDIR。
我必须运行一个名为'BLAST‘的程序,它是一个.exe程序,需要几个参数,包括DB的位置。
当我运行映像时,会出现错误,因为它找不到安装的DB位置。完全错误消息是b'BLAST Database error: No alias or index file found for nucleotide database [/mnt/fsx/ntdb/nt] in search path [/opt:/fsx/ntdb:]\n'],其中/mnt/fsx/ntdb/nt是DB路径。
唯一的假设是,我在Dockerfile中给出了WORKDIR,因此默认工作区设置为'/opt:‘。
我想知道我该如何解决这个问题。通过移除WORKDIR?还是别的什么?
我的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" ]编辑:我发现了更多信息,当查看错误时,BLAST程序试图在路径/opt:/fsx/ntdb:上搜索db,这是Dockerfile中作为WORKDIR的路径集和os.environ.['BLASTDB'] (Os.environ[BLASTDB]描述.)设置的BLASTDB路径的组合。
发布于 2022-10-13 00:01:22
经过多次调试试验,找出了问题所在。所以问题既不是WORKDIR,也不是os.environ.['BLASTDB']。正确定义了路径,根据[/opt:/fsx/ntdb:]中的内容,BLAST程序搜索这里的方法是正确的。
实际的解决方案是检查文件系统是否正确安装以及文件系统内文件的权限。最初我认为文件系统被正确地挂载了,因为我已经从其他批提交作业中多次测试过,但是只创建了挂载文件夹,文件就不存在了。因此,即使程序试图查找索引文件,它也找不到任何这样的错误。
https://stackoverflow.com/questions/74035796
复制相似问题