PHP语言Docker镜像部署AWS Lambda的容器配置及权限报错如何解决?
问题根本原因
你遇到的Runtime.InvalidEntrypoint报错核心是PHP官方基础镜像自带了默认入口脚本/usr/local/bin/docker-php-entrypoint,而AWS Lambda运行自定义容器时默认采用非root权限执行,该入口脚本的权限配置不符合Lambda运行要求,且优先级高于你配置的CMD参数,所以无论你怎么修改CMD内容都会触发相同的权限报错。
原示例中CMD ["index"]的作用
AWS官方示例采用的Amazon Linux基础镜像没有配置默认ENTRYPOINT,Lambda启动容器时会自动查找/var/runtime/bootstrap作为执行入口,CMD传入的index参数会被bootstrap脚本接收,用于指定要加载的业务代码入口文件名(对应你存放在/var/task/index.php的处理逻辑)。
修复方案
你只需要在原有Dockerfile基础上做三处调整即可解决问题:
- 显式覆盖基础镜像的默认ENTRYPOINT,指向你自己的运行时引导文件
- 给bootstrap文件赋予可执行权限
- 调整Composer依赖的存储位置,避免放在只有root能访问的/root目录下
修改后的Dockerfile参考
# Demo of a PHP-based lambda FROM php:8.0-cli-alpine # 调整工作目录到非root可访问的路径 WORKDIR /var/task # Install Composer COPY bin bin RUN sh /var/task/bin/install-composer.sh RUN php /var/task/composer.phar --version # Install Composer deps COPY composer.json composer.lock /var/task/ RUN php composer.phar install # Install runtimes,同时给bootstrap加执行权限 COPY runtime /var/runtime RUN chmod +x /var/runtime/bootstrap COPY src /var/task/ # 显式指定ENTRYPOINT覆盖基础镜像的默认配置 ENTRYPOINT ["/var/runtime/bootstrap"] # 保留原有的CMD参数,用于指定业务入口文件名 CMD ["index"]
额外检查项
确认你的/var/runtime/bootstrap文件首行存在正确的shebang声明:
#!/usr/bin/env php
如果缺少这行,运行时还是会触发无法执行的报错。
按照以上配置重新构建镜像推送ECR后即可正常运行,不需要调整bootstrap的存放路径,完全符合官方自定义运行时的规范要求。
内容的提问来源于stack exchange,提问作者halfer
相关产品推荐
相关产品推荐

