基于ECR镜像的Python Lambda函数遇只读文件系统错误的解决步骤
解决Lambda镜像只读文件系统错误的具体步骤
方法一:构建镜像时预先下载NLTK数据(推荐)
Lambda运行环境仅/tmp目录可写,运行时下载NLTK数据会触发只读目录写入错误,预先在构建阶段下载数据可彻底解决问题,还能减少冷启动时间。
- 修改Dockerfile,在构建阶段添加NLTK数据下载步骤:
FROM public.ecr.aws/lambda/python:3.8 WORKDIR /app COPY requirements.txt . COPY kbtrial.csv . RUN pip3 install -r requirements.txt # 预先下载punkt数据到Lambda可读取的目录 RUN python3 -c "import nltk; nltk.download('punkt', download_dir='/opt/nltk_data')" COPY app.py . CMD ["/app/app.handler"] - 修改
app.py,移除运行时下载代码并指定NLTK数据路径:import nltk # 设置NLTK读取预先下载的数据 nltk.data.path.append('/opt/nltk_data') from nltk.tokenize import word_tokenize def handler(event, context): # 你的业务逻辑代码 pass - 重新构建并推送镜像到ECR:
docker build -t lambda-nltk-image . docker tag lambda-nltk-image <你的ECR仓库URI>:latest docker push <你的ECR仓库URI>:latest - 更新Lambda函数使用新镜像,测试运行。
方法二:运行时将数据写入/tmp目录(临时方案)
如果无法修改构建流程,可临时利用Lambda唯一可写的/tmp目录:
- 修改
app.py中的下载逻辑:import nltk # 指定下载目录为/tmp下的可写路径 nltk.download('punkt', download_dir='/tmp/nltk_data') nltk.data.path.append('/tmp/nltk_data') from nltk.tokenize import word_tokenize def handler(event, context): # 你的业务逻辑代码 pass - 重新构建镜像、推送到ECR并更新Lambda函数。
注意:此方法每次冷启动都会重新下载数据,会增加启动耗时,仅作为临时替代方案。
内容的提问来源于stack exchange,提问作者Rohan Sarkar
相关产品推荐
相关产品推荐

