运行Docker镜像时提示gunicorn: command not found的问题求助
运行Docker镜像时出现gunicorn: command not found错误,进入镜像手动执行gunicorn也报同样错误,但执行pip install gunicorn时显示该包已安装:
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: gunicorn in ./.local/lib/python3.10/site-packages (20.1.0)
Requirement already satisfied: setuptools>=3.0 in /usr/local/lib/python3.10/site-packages (from gunicorn) (58.1.0)
相关构建文件
Dockerfile
FROM python:3.10.5-alpine ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 RUN adduser -D appuser USER appuser WORKDIR /home/appuser/ COPY --chown=appuser:appuser requirements.txt . RUN python -m pip install --user --no-cache-dir --disable-pip-version-check --requirement requirements.txt COPY --chown=appuser:appuser . . ENTRYPOINT [ "./entrypoint.sh" ]
requirements.txt
django==4.0.6 psycopg2-binary==2.9.3 gunicorn==20.1.0
entrypoint.sh
#!/bin/sh python manage.py makemigrations python manage.py migrate python manage.py collectstatic --no-input gunicorn project.wsgi:application --bind=0.0.0.0:8000 --workers=4 --timeout=300 --log-level=debug --log-file=-
使用pip install --user安装的Python包,其可执行文件会被放在用户主目录的.local/bin路径下,但这个路径默认不在Docker容器的PATH环境变量中,导致系统无法找到gunicorn命令。
方案1:将用户本地bin目录加入PATH
修改Dockerfile,在切换到appuser用户后添加环境变量配置,把.local/bin加入系统PATH:
USER appuser ENV PATH="/home/appuser/.local/bin:${PATH}"
或者在entrypoint.sh的开头添加环境变量导出命令:
export PATH="/home/appuser/.local/bin:$PATH"
方案2:安装到系统全局site-packages
如果允许将依赖安装到系统全局目录,可以去掉pip install命令中的--user参数,并在root用户身份下完成依赖安装,之后再切换到appuser:
# 先以root身份安装依赖,无需--user参数 RUN python -m pip install --no-cache-dir --disable-pip-version-check --requirement requirements.txt # 再切换到普通用户 USER appuser
注意:Alpine镜像中Python的全局site-packages目录默认是全局可读的,普通用户可以正常使用这些依赖。
方案3:直接以Python模块方式启动gunicorn
不需要依赖系统PATH,直接通过Python调用gunicorn模块来启动服务,修改entrypoint.sh中的启动命令:
python -m gunicorn project.wsgi:application --bind=0.0.0.0:8000 --workers=4 --timeout=300 --log-level=debug --log-file=-
内容的提问来源于stack exchange,提问作者Omid Shojaee

