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

