切换至Python Alpine镜像后Django应用Docker入口脚本找不到
问题:切换Python Alpine镜像后Entrypoint脚本无法执行
将Django应用的Docker基础镜像从python:3.10切换为python:alpine3.17后,执行docker run -it myapp:latest启动容器时,出现错误:
exec /app/entrypoint-prod.sh: no such file or directory
现有Dockerfile内容
FROM python:alpine3.17 # Keeps Python from generating .pyc files in the container ENV PYTHONDONTWRITEBYTECODE=1 # Turns off buffering for easier container logging ENV PYTHONUNBUFFERED=1 WORKDIR /app # install psycopg2 dependencies RUN apk update \ && apk add postgresql-dev gcc python3-dev musl-dev COPY Pipfile /app COPY Pipfile.lock /app RUN pip install pipenv RUN pipenv install --system COPY . /app USER root RUN chmod +x /app/entrypoint-prod.sh ENTRYPOINT ["/app/entrypoint-prod.sh"]
现有entrypoint-prod.sh脚本内容
#!/bin/bash # Apply migrations python manage.py migrate --noinput # Collect static python manage.py collectstatic --no-input --clear # Start the application gunicorn grayti_backend.wsgi:application --bind 0.0.0.0:8000 --workers 3
问题原因
Alpine Linux默认未预装bash,而你的entrypoint脚本开头指定了#!/bin/bash作为解释器,系统找不到该解释器,因此抛出看似“文件不存在”的错误(实际是解释器缺失)。
解决方案
方案1:修改脚本的Shebang为Alpine默认Shell
将entrypoint-prod.sh的第一行从#!/bin/bash改为#!/bin/sh:
#!/bin/sh # Apply migrations python manage.py migrate --noinput # Collect static python manage.py collectstatic --no-input --clear # Start the application gunicorn grayti_backend.wsgi:application --bind 0.0.0.0:8000 --workers 3
方案2:在Dockerfile中安装bash
在apk add步骤中添加bash包,确保系统能找到bash解释器:
RUN apk update \ && apk add postgresql-dev gcc python3-dev musl-dev bash
额外验证
确保脚本权限正确,Dockerfile中COPY文件后执行权限赋予操作:
COPY . /app RUN chmod +x /app/entrypoint-prod.sh
内容的提问来源于stack exchange,提问作者Mohamed El Hadramy Oumar
相关产品推荐
相关产品推荐

