基于RockyLinux的Docker镜像部署AWS Lambda遇Runtime.InvalidEntrypoint权限错误
问题:AWS Lambda使用非root用户镜像时出现Runtime.InvalidEntrypoint权限拒绝错误
问题背景
我基于rockylinux:8.9构建Docker镜像,原本用于ECS环境,现在要适配AWS Lambda。按照官方文档安装了awslambdaric并修改ENTRYPOINT,但测试Lambda时出现权限拒绝错误,移除RUN adduser worker和USER worker步骤后问题解决,想明确背后的原因。
相关文件与错误信息
修改后的Dockerfile(精简版)
FROM rockylinux:8.9 RUN yum -y update && \ yum -y upgrade HEALTHCHECK NONE RUN yum install -y nano && \ yum install -y wget RUN adduser worker USER worker ARG HOME='/home/worker' WORKDIR $HOME RUN wget https://repo.anaconda.com/miniconda/Miniconda3-py310_23.10.0-1-Linux-x86_64.sh -O miniconda.sh && \ bash miniconda.sh -b -p ${HOME}/miniconda && \ rm miniconda.sh && \ source ${HOME}/miniconda/bin/activate && \ conda init --all ENV PATH="${HOME}/miniconda/bin:${PATH}" ARG BUILD=${HOME}/build RUN mkdir ${BUILD} COPY lambda_function.py ${BUILD} RUN pip install --target ${BUILD} awslambdaric ENTRYPOINT ["/home/worker/miniconda/bin/python3.10", "-m", "awslambdaric"] CMD [ "lambda_function.handler" ]
Lambda错误信息
{ "errorType": "Runtime.InvalidEntrypoint", "errorMessage": "RequestId: d8919b62-472d-46c9-acf3-2b5ddaf49264 Error: fork/exec /home/worker/miniconda3/bin/python3.10: permission denied" }
本地容器测试情况
- 权限检查结果:
[worker@7525b61497ad bin]$ ls -al python3.10 -rwxrwxr-x 1 worker worker 17157264 Apr 10 19:14 python3.10
- 本地可正常运行Python:
[worker@7525b61497ad bin]$ python Python 3.10.13 (main, Sep 11 2023, 13:44:35) [GCC 11.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> exit()
项目结构
test ├── Dockerfile └── lambda_function.py
lambda_function.py内容
import sys def handler(event, context): return 'Hello from AWS Lambda using Python' + sys.version + '!'
原因分析
Lambda运行容器时,会以非root用户执行,但对容器内用户的权限有额外要求:
- 本地容器中
worker用户虽拥有python3.10的执行权限,但Lambda运行环境使用的是沙箱专属非root用户(如sbx_userxxxx),该用户可能无法访问/home/worker目录——若目录权限仅对worker用户开放,沙箱用户会被拒绝访问。 - Miniconda安装时,部分文件或目录的权限默认仅对安装用户(worker)开放,Lambda沙箱用户无执行或读取权限,导致无法启动Python进程。
- 错误信息中的路径
/home/worker/miniconda3/bin/python3.10与Dockerfile中指定的${HOME}/miniconda不一致,可能是conda初始化时自动创建了链接或重命名,但权限未同步,进一步加剧了权限问题。
解决方法
方法1:调整目录与文件全局权限
在Dockerfile中安装Miniconda后,修改相关目录权限,允许其他用户访问执行:
# 安装Miniconda后添加 RUN chmod -R o+rx ${HOME}/miniconda # 创建worker用户后添加,确保/home/worker目录可被其他用户访问 RUN chmod o+rx /home/worker
方法2:将Miniconda安装到全局目录
把Miniconda安装到全局路径(如/opt/miniconda),先以root用户完成安装并调整权限,再切换到worker用户:
FROM rockylinux:8.9 RUN yum -y update && \ yum -y upgrade HEALTHCHECK NONE RUN yum install -y nano && \ yum install -y wget # 先以root安装Miniconda到全局目录 ARG MINICONDA_PATH='/opt/miniconda' RUN wget https://repo.anaconda.com/miniconda/Miniconda3-py310_23.10.0-1-Linux-x86_64.sh -O miniconda.sh && \ bash miniconda.sh -b -p ${MINICONDA_PATH} && \ rm miniconda.sh && \ chmod -R o+rx ${MINICONDA_PATH} ENV PATH="${MINICONDA_PATH}/bin:${PATH}" # 创建并切换到worker用户 RUN adduser worker USER worker ARG HOME='/home/worker' WORKDIR $HOME ARG BUILD=${HOME}/build RUN mkdir ${BUILD} COPY lambda_function.py ${BUILD} RUN pip install --target ${BUILD} awslambdaric ENTRYPOINT ["/opt/miniconda/bin/python3.10", "-m", "awslambdaric"] CMD [ "lambda_function.handler" ]
方法3:启动时切换用户(折中方案)
若需保留ECS原有功能,可保持root用户,在ENTRYPOINT中通过su切换到worker用户执行:
# 移除USER worker步骤,保持root身份 ENTRYPOINT ["su", "worker", "-c", "/home/worker/miniconda/bin/python3.10 -m awslambdaric"] CMD [ "lambda_function.handler" ]
此方式可能增加启动开销,需测试Lambda兼容性。
内容的提问来源于stack exchange,提问作者Cogito Ergo Sum
相关产品推荐
相关产品推荐

