【问题标题】:Issue in the Dockerfile when deploying a Django App on GAE在 GAE 上部署 Django 应用程序时 Dockerfile 中的问题
【发布时间】:2019-03-06 10:23:33
【问题描述】:

我正在尝试使用 Dockerfile 的自定义映像在 GAE 上部署我的 Django 应用程序。我正在关注 Google 提供的 example。但是我在最后一步有一个问题:

CMD gunicorn -b :$PORT main:app

我尝试了几件事,但一直说找不到我的模块。

我尝试过的:

CMD gunicorn -b :$PORT wsgi:app

CMD gunicorn -b :$PORT mydjangoproject/wsgi:app

CMD gunicorn -b :$PORT mydjangoproject.wsgi


Docker 文件:

FROM solalsab/clarins:1.0.1

# Create a virtualenv for dependencies. This isolates these packages from
# system-level packages.
# Use -p python3 or -p python3.7 to select python version. Default is version 2.
RUN virtualenv /env

# Setting these environment variables are the same as running
# source /env/bin/activate.
ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH

# Copy the application's requirements.txt and run pip to install all
# dependencies into the virtualenv.
ADD requirements.txt requirements.txt
RUN pip install -r requirements.txt

# Add the application source code.
ADD . /app

# Run a WSGI server to serve the application. gunicorn must be declared as
# a dependency in requirements.txt.
CMD gunicorn -b :$PORT main:app

项目结构:

+myproject/
 +mydjangoproject/
 | +wsgi.py
 | +...
 +app_template.yaml
 +generate_app_yaml.pu
 +manage.py
 +requirements.txt
 +Dockerfile

错误信息:

ERROR: (gcloud.app.deploy) Error Response: [9] 
Application startup error:
[2019-03-06 11:15:47 +0000] [6] [INFO] Starting gunicorn 19.9.0
[2019-03-06 11:15:47 +0000] [6] [INFO] Listening at: http://0.0.0.0:8080 (6)
[2019-03-06 11:15:47 +0000] [6] [INFO] Using worker: sync
[2019-03-06 11:15:47 +0000] [9] [INFO] Booting worker with pid: 9
[2019-03-06 11:15:47 +0000] [9] [ERROR] Exception in worker process
Traceback (most recent call last):
  File "/env/lib/python3.6/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
    worker.init_process()
  File "/env/lib/python3.6/site-packages/gunicorn/workers/base.py", line 129, in init_process
    self.load_wsgi()
  File "/env/lib/python3.6/site-packages/gunicorn/workers/base.py", line 138, in load_wsgi
    self.wsgi = self.app.wsgi()
  File "/env/lib/python3.6/site-packages/gunicorn/app/base.py", line 67, in wsgi
    self.callable = self.load()
  File "/env/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 52, in load
    return self.load_wsgiapp()
  File "/env/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 41, in load_wsgiapp
    return util.import_app(self.app_uri)
  File "/env/lib/python3.6/site-packages/gunicorn/util.py", line 350, in import_app
    __import__(module)
ModuleNotFoundError: No module named 'main'
[2019-03-06 11:15:47 +0000] [9] [INFO] Worker exiting (pid: 9)
[2019-03-06 11:15:47 +0000] [6] [INFO] Shutting down: Master
[2019-03-06 11:15:47 +0000] [6] [INFO] Reason: Worker failed to boot.

提前感谢您的帮助!

【问题讨论】:

  • 检查您的源代码添加到的位置。 Dockerfile 说 ADD . /app.
  • 我原样离开了ADD. /app。但是我的 Django 应用程序没有名为 main 的模块。我有点困惑。
  • 可以添加你项目的文件夹结构吗?
  • 我是说:您的尝试都不尊重 docker 文件夹结构。这里的WORKDIR(工作文件夹)是什么?您的 myproject.wsgi 文件在哪里?
  • 我已经更新了我的问题,所以我添加了文件夹的结构(我试图只包含相关文件)并添加了完整的 Dockerfile

标签: django google-app-engine dockerfile


【解决方案1】:

main:app 部分可能取自其他代码示例(例如 here),其中添加了 main.py 文件以引用您的应用。在您的情况下,您可以在根目录中创建 main.py 文件并添加:

from mydjangoproject.wsgi import application

app = application

或者像这样更新你的 Dockerfile:

CMD gunicorn -b :$PORT mydjangoproject.wsgi

【讨论】:

  • 我已按照您的建议在根目录中编写 main.py。并写在我的 Dockerfile CMD gunicorn -b :$PORT main:app。但是它仍然可以找到模块main。我猜这个问题不会出现在CMD 行?
  • 也许问题来自“app_template.yaml”文件?
【解决方案2】:

我终于通过运行成功让它工作了:

CMD 光盘应用程序;执行 gunicorn mydjangoproject.wsgi

【讨论】:

    猜你喜欢
    • 2020-11-02
    • 2015-08-07
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 2020-08-02
    • 2016-09-06
    相关资源
    最近更新 更多