AWS Docker镜像部署Python Lambda无法访问/tmp目录文件问题咨询
问题原因
- 文件系统隔离:Lambda执行环境的
/tmp目录是当前运行实例独有的,若你在Lambda内部启动Docker容器,Docker默认使用独立的文件系统,没有挂载共享目录的情况下,容器内进程无法访问Lambda宿主机的/tmp路径,会直接报文件不存在类的OSError。如果两个函数是分开部署的独立Lambda服务,那各自的执行环境完全隔离,更无法跨实例访问对方的/tmp文件。 - 权限不匹配:就算已经挂载了共享目录,Lambda默认执行用户UID为993,若Docker容器内运行进程的用户UID和该值不一致,没有读取
/tmp/data.h5s文件的权限,也会触发OSError。 - 执行时序问题:如果Docker内的访问函数在S3文件下载完成前就启动执行,此时文件不存在或者还在写入未完成,读取操作也会报错。
- 依赖缺失:Docker镜像内未安装HDF5格式对应的依赖库
pytables,调用pd.HDFStore时也会抛出OSError。
可行解决方法
- 共享目录挂载:如果是在同一个Lambda实例内启动Docker容器,启动时添加挂载参数
docker run -v /tmp:/tmp <镜像名>,将Lambda的/tmp目录挂载到容器内的对应路径,实现文件共享。 - 权限适配:
- 下载完文件后执行
os.chmod('/tmp/data.h5s', 0o644),给所有用户增加文件读权限 - 或者启动Docker时指定运行用户和Lambda执行用户一致:
docker run -v /tmp:/tmp --user 993:993 <镜像名>
- 下载完文件后执行
- 时序校验:触发Docker内的函数执行前,先校验文件状态:
import os file_path = '/tmp/data.h5s' if not (os.path.exists(file_path) and os.path.getsize(file_path) > 0): # 等待下载完成或抛出下载异常 raise Exception("S3文件未下载完成")
- 依赖补全:在Docker镜像的Dockerfile中添加HDF5依赖安装步骤:
RUN pip install pandas tables
- 跨Lambda实例场景适配:如果两个函数是独立部署的Lambda服务,无法共享本地
/tmp,可选择以下方案:- 给两个Lambda挂载同一个EFS文件系统,将下载的文件存储到EFS路径下,两边都可访问
- 第一个函数下载完文件后重新上传到S3,第二个函数执行时先从S3拉取对应文件再读取
内容的提问来源于stack exchange,提问作者user2586970
相关产品推荐
相关产品推荐

