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

Docker启动报错:exec /usr/src/app/entrypoint.sh不存在,求助排查

Docker容器启动报错:exec ./entrypoint.sh: no such file or directory(Windows 11环境)

在Windows 11环境下执行docker compose up启动web服务时,出现报错:exec ./entrypoint.sh: no such file or directory,但该文件确实存在于本地文件夹中,且在web容器文件列表中也能看到。同时db容器可正常运行。

相关配置文件

docker-compose.yml

version: "3"
services:
  db:
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=db
    image: postgres:14.0-alpine
    ports:
      - 5442:5432
  web:
    environment:
      - GMAIL_USER=gmailuser@gmail.com
      - GMAIL_PASSWORD=gmailpassword
    build: ./
    command: python manage.py runserver 0.0.0.0:8080
    volumes:
      - ./:/usr/src/app/
    ports:
      - 80:8080
    env_file:
      - ./.env
    depends_on:
      - db

Dockerfile

# pull official base image
FROM python:3.7-alpine

# set work directory
WORKDIR /usr/src/app

# set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN apk update \
    && apk add postgresql-dev gcc python3-dev musl-dev jpeg-dev zlib-dev make
# install dependencies
RUN pip install --upgrade pip
COPY ./requirements.txt /usr/src/app/requirements.txt
RUN pip install -r requirements.txt

# copy project
COPY . /usr/src/app/
COPY ./entrypoint.sh /usr/src/app/entrypoint.sh
RUN chmod +x /usr/src/app/entrypoint.sh
# run entrypoint.sh
EXPOSE 80
ENTRYPOINT ["/usr/src/app/entrypoint.sh"]

entrypoint.sh

#!/bin/sh
# python manage.py flush --no-input
python manage.py makemigrations
python manage.py migrate
if [ $ENV = "prod" ]; then python manage.py collectstatic --no-input; fi
python manage.py loaddata */fixtures/*.json
echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.filter(email='admin@domain').exists() or User.objects.create_superuser('admin@domain', 'password')" | python manage.py shell
exec "$@"

已尝试的方法

  • 执行docker exec -it <container_name_or_id> sh,但因容器无法启动无法进入;
  • 执行docker run -v /local/path/to/entrypoint.sh:/usr/src/app/entrypoint.sh my_image,仍出现相同报错。

解决方案

1. 修复换行符问题

Windows默认使用CRLF换行,而Linux容器仅识别LF换行,这会导致脚本无法被正确解析:

  • 用VS Code打开entrypoint.sh,点击右下角的CRLF切换为LF后保存;
  • 或在Dockerfile中添加换行符修复命令,在RUN chmod +x ...前加入:
    RUN sed -i 's/\r$//' /usr/src/app/entrypoint.sh
    

2. 避免挂载覆盖容器内的entrypoint.sh

当前docker-compose.yml中把本地目录挂载到/usr/src/app/,会覆盖容器内预先复制的entrypoint.sh:

  • 移除web服务中的volumes: - ./:/usr/src/app/(无需实时代码更新时);
  • 或修改挂载规则,仅挂载项目代码目录,比如:
    volumes:
      - ./app:/usr/src/app/app
    
  • 或把entrypoint.sh复制到容器内非挂载目录,修改Dockerfile:
    COPY ./entrypoint.sh /usr/local/bin/entrypoint.sh
    RUN chmod +x /usr/local/bin/entrypoint.sh && sed -i 's/\r$//' /usr/local/bin/entrypoint.sh
    ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
    

3. 验证脚本路径与执行权限

确保ENTRYPOINT路径正确,且chmod命令生效。可以重新构建镜像:

docker-compose build --no-cache web
docker-compose up web

内容的提问来源于stack exchange,提问作者Dr.Dan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:35:37