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

Ubuntu 20.04下Docker-compose启动失败:entrypoint.sh权限被拒绝

问题:Docker Compose在Ubuntu 20.04启动报错entrypoint.sh权限拒绝,Windows下正常

我的docker-compose在Windows 10环境可正常运行,但在Ubuntu 20.04中启动时出现如下错误:

ERROR: for container_web_1  Cannot start service web: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "/usr/src/app/entrypoint.sh": permission denied: unknown

ERROR: for web  Cannot start service web: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "/usr/src/app/entrypoint.sh": permission denied: unknown
ERROR: Encountered errors while bringing up the project.

我已经用chmod +x设置过entrypoint.sh的执行权限,无法理解为何仍出现权限问题。以下是我的Dockerfile内容:

FROM python:3.10.0-alpine
WORKDIR /usr/src/app
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
RUN pip install --upgrade pip
RUN apk update
RUN apk add postgresql-dev gcc python3-dev musl-dev
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY entrypoint.sh .
RUN sed -i 's/\r$//g' /usr/src/app/entrypoint.sh
RUN chmod +x /usr/src/app/entrypoint.sh
COPY .. .
ENV HOME=/home/app
ENV APP_HOME=/home/app/web
RUN mkdir $HOME
RUN mkdir $APP_HOME
WORKDIR $APP_HOME
COPY .. $APP_HOME
RUN mkdir $APP_HOME/staticfiles
RUN mkdir $APP_HOME/mediafiles
ENTRYPOINT ["/usr/src/app/entrypoint.sh"]

解决方法

1. 修正Dockerfile的COPY顺序,避免覆盖已授权的entrypoint.sh

你的Dockerfile中,在设置完entrypoint.sh的执行权限后,又执行了COPY .. .和COPY .. $APP_HOME命令,这会把本地目录下的entrypoint.sh(可能未设置执行权限)覆盖掉容器内已配置好权限的版本。

调整步骤:

  • 将COPY entrypoint.sh .、sed和chmod命令移到所有COPY ..操作之后;
  • 避免重复复制整个目录,只复制必要的应用文件到目标路径。

修改后的Dockerfile示例:

FROM python:3.10.0-alpine
WORKDIR /usr/src/app
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN pip install --upgrade pip
RUN apk update && apk add postgresql-dev gcc python3-dev musl-dev

COPY requirements.txt .
RUN pip install -r requirements.txt

# 先复制应用代码到工作目录
COPY . .

# 最后处理entrypoint.sh,确保不会被后续操作覆盖
COPY entrypoint.sh .
RUN sed -i 's/\r$//g' /usr/src/app/entrypoint.sh
RUN chmod +x /usr/src/app/entrypoint.sh

# 设置应用目录
ENV HOME=/home/app
ENV APP_HOME=/home/app/web
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME
# 仅复制必要的应用文件到APP_HOME
COPY ./web/ $APP_HOME/

RUN mkdir $APP_HOME/staticfiles $APP_HOME/mediafiles

ENTRYPOINT ["/usr/src/app/entrypoint.sh"]

2. 检查Docker Compose的挂载配置

如果你的docker-compose.yml中存在将本地目录挂载到容器/usr/src/app或$APP_HOME的配置(比如volumes: - .:/usr/src/app),容器内的entrypoint.sh会被本地文件覆盖。此时:

  • 在Ubuntu主机上执行chmod +x entrypoint.sh,确保本地文件拥有执行权限;
  • 或者修改挂载路径,避免覆盖/usr/src/app/entrypoint.sh;
  • 若使用Windows共享目录挂载到Ubuntu,由于NTFS文件系统不支持Linux权限位,需避免用挂载覆盖entrypoint,或在Dockerfile中重新设置权限。

3. 验证entrypoint.sh的换行符

虽然你已经用sed处理了Windows换行符,但可在Ubuntu上执行cat -A entrypoint.sh查看文件,确认没有^M(Windows回车符)残留,这类字符也可能导致执行失败。

内容的提问来源于stack exchange,提问作者Anonymous Wizard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 04:54:55