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
相关产品推荐
相关产品推荐

