尝试启动Django应用程序时,Gunicorn不起作用

时间:2017-09-26 17:31:47

标签: python django gunicorn

我正在关注this教程,直到这部分。

start.sh

#!/bin/bash

# Start Gunicorn processes
echo Starting Gunicorn.
exec gunicorn helloworld.wsgi:application \
    --bind 0.0.0.0:8000 \
    --workers 3

我的目录是这样的。

awesome_app
-awesome_app
--__init__.py
--celery.py
--settings.py
--urls.py
--wsgi.py
-awesome_app_to_do_list
--a lot of stuffs here
-manage.py
-start.sh

这是我wsgi.py的内容。

"""
WSGI config for airport project.

It exposes the WSGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/1.11/howto/deployment/wsgi/
"""

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "awesome_app.settings")

application = get_wsgi_application()

我将启动代码改编为此。

#!/bin/bash

# Start Gunicorn processes
echo starting gunicorn
exec gunicorn awesome_app.wsgi:application \
    --bind 0.0.0.0:8080 \
    --workers 3

我将其设为可执行文件并从项目awesome_app的根目录运行脚本,而不是从awesome_app / awesome_app运行。我收到此错误ImportError: No module named 'myproject'。我看过this SO讨论,但错误仍然存​​在。我该怎么办?

4 个答案:

答案 0 :(得分:1)

进入项目目录并尝试在命令行中运行它,而不是运行脚本并查看它是否有效:

{{1}}

答案 1 :(得分:1)

解决了这个问题。显然罪魁祸首是celery.py设置。在其中,我有这些代码。

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')

app = Celery('myproject')

愚蠢的是,我只是从Celery + Django示例复制粘贴代码。更愚蠢,因为我的网络应用程序工作正常,为什么。

所以我将celery.py中的代码更改为这些代码并且它正在运行。

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'awesome_app.settings')

app = Celery('awesome_app')

对于遇到相同问题的任何人,请查看os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')并将myproject更改为您的Django项目名称。

答案 2 :(得分:0)

BaconSandwich的答案是要走的路。但是,如果需要脚本,请尝试将工作目录设置为脚本所在的目录。

#!/bin/bash
cd "$(dirname "$0")"

尝试将此前缀添加到脚本中,看看它是否有效。

答案 3 :(得分:0)

首先The ONBUILD image variants are deprecated, and their usage is discouraged. For more details, see docker-library/official-images#2076.检查:Python Docker Hub

因此,对于最佳实践方式,更多地了解实际发生的事情,dockerfile将是这样的:

重要确保您所在的主机目录中包含已启动的django项目和已执行的start.sh

1)如果要使用python3,请将FROM基本图像FROM python:2更改为3。

2)在docker img中指定WORKDIR让我们说WORKDIR /usr/scr/project 这将确保在运行start.sh

时确保通向gunicorn的正确途径

3)将COPY requirements.txt复制到泊坞窗图片COPY requirements.txt ./

4)运行RUN点以在docker镜像pip install --no-cache-dir -r requirements.txt

中安装您的需求

5)将COPY所有项目文件复制到泊坞窗图片COPY . .

4)定义一个启动器命令CMD CMD ./start.sh

<强> DockerFile

# Dockerfile

# Fetching `FROM` a base image `FROM python:2` 
# Change it to 3 if you want to use python3.
FROM python:2

# Specify WORKDIR inside the docker img 
# Lets say WORKDIR /usr/scr/project 
# That will insure a correct path to gunicorn when running the start.sh
WORKDIR /usr/scr/project

# Copying COPY requirements.txt to the docker image COPY requirements.txt ./
COPY requirements.txt ./

#Runing RUN pip to install your requirements inside the docker image pip install --no-cache-dir -r requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

# Copying COPY all the project files into the docker image COPY . .
COPY . .

# EXPOSE port 8000 to allow communication to/from server
EXPOSE 8000

# Define a starter command CMD CMD ./start.sh.
CMD ["./start.sh"]

已编辑:在dockerfile中缺少RUN