使用GitHub Actions更新Elastic Beanstalk时遇入口点权限拒绝问题
问题分析与解决方案
核心结论
报错exec: "./docker/entrypoint.sh": permission denied和IAM无关,是Docker镜像中的entrypoint.sh缺少执行权限导致的。EBS启动容器时会严格遵循Dockerfile中定义的用户,和GitHub Actions的部署服务用户没有关系。
问题原因
- 手动构建镜像时,本地的
entrypoint.sh文件可能已经通过chmod +x赋予了执行权限,所以容器能正常启动。 - GitHub Actions中构建镜像时,Git默认不会追踪文件的执行权限位,
COPY指令将文件复制到镜像后,文件没有x(执行)权限。虽然Dockerfile中切换到了user101用户,但该用户没有权限修改文件权限,最终导致容器启动时无法执行脚本。
修复步骤
修改Dockerfile,在USER ${USERNAME}之前添加赋予entrypoint.sh执行权限的命令:
FROM python:3.10-slim-buster ARG APP_HOME=/code \ USERNAME=user101 WORKDIR ${APP_HOME} RUN addgroup --system ${USERNAME} \ && adduser --system --ingroup ${USERNAME} ${USERNAME} RUN apt-get update --yes --quiet && apt-get install --no-install-recommends --yes --quiet \ build-essential \ libpq-dev \ git \ && rm -rf /var/lib/apt/lists/* # 先复制entrypoint.sh并赋予执行权限 COPY ./docker/entrypoint.sh ${APP_HOME}/docker/entrypoint.sh RUN chmod +x ${APP_HOME}/docker/entrypoint.sh COPY . --chown=${USERNAME}:${USERNAME} ${APP_HOME} RUN pip install --upgrade pip RUN pip install poetry RUN poetry install --no-interaction --no-ansi EXPOSE 80 USER ${USERNAME} ENTRYPOINT ["./docker/entrypoint.sh" ] CMD ["gunicorn", "config.wsgi:application", "--bind", ":80"]
如果习惯一次性复制所有文件,也可以在全局COPY后添加权限设置:
COPY . --chown=${USERNAME}:${USERNAME} ${APP_HOME} # 此时仍为root用户,有权限修改文件权限 RUN chmod +x ./docker/entrypoint.sh
补充说明
- GitHub Actions的部署角色
ServiceRoleForEBSDeploy只负责完成镜像推送、EBS版本创建和环境更新操作,不会影响容器内部的运行用户和文件权限。 - 手动部署正常是因为本地环境中文件权限已经正确设置,而CI环境中Git克隆的文件默认没有执行权限,必须在Dockerfile中显式配置。
内容的提问来源于stack exchange,提问作者Original BBQ Sauce
相关产品推荐
相关产品推荐

