You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:10:34