2017-09-26 73 views
0

我正在關注this教程,直到達到此部分。Gunicorn在嘗試啓動Django應用程序時不工作

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的討論,但錯誤仍然存​​在。我該怎麼辦?

+0

你在哪裏導入myproject? –

+0

wsgi文件中的「airport」,啓動腳本中的「awesome_app」和錯誤消息中的「myproject」之間存在不匹配。 – Alasdair

+0

@Oluwafemi蘇勒,我不知道。它在Python + Gunicorn教程中無處不在。 – notalentgeek

回答

1

進入你的項目目錄,並嘗試只是在命令行中運行這個,而不是運行該腳本,看看它的工作原理:

gunicorn --bind 0.0.0.0:8000 myprojectname.wsgi 
+0

我從項目根目錄運行'gunicorn --bind 0.0.0.0:8080 awesome_app.wsgi'。同樣的錯誤:'ImportError:沒有名爲'myproject'的模塊。 – notalentgeek

0

BaconSandwich的答案是要走的路。然而,如果需要的腳本,儘量將工作目錄設置爲腳本所在的目錄。

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

嘗試前面加上這劇本,看看它是否工作。

+1

嘿多利安,它仍然有相同的錯誤,'ImportError:沒有名爲'myproject'的模塊。不過,知道更改腳本所在的目錄是一件好事。謝謝! – notalentgeek

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)獲取FROM基本圖像FROM python:2如果您想使用python3,請將其更改爲3。

2)指定的WORKDIR IMG搬運工內可以說WORKDIR /usr/scr/project 將確保一個正確的路徑運行start.sh

3)複製COPY requirements.txt到搬運工圖像COPY requirements.txt ./

4)時gunicorn Runing RUN pip將您的要求安裝在碼頭圖像中pip install --no-cache-dir -r requirements.txt

5)複製COPY l將項目文件放入泊塢窗圖像COPY . .

4)定義起動器命令CMDCMD ./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

0

解決了這個問題,無法運行。顯然,罪魁禍首是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例子複製粘貼代碼。因爲我的web應用程序工作正常,所以更愚蠢,idk爲什麼。

因此,我將這些代碼在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項目命名。

相關問題