长话短说,我正在尝试使用docker将我的Django项目通过Heroku投入生产。这是我有史以来第一个Django项目,也是第一次使用Docker。
当前,当我尝试运行图像时出现错误,这是我第一次尝试测试图像是否运行良好。在将其放入docker映像之前,我确实检查了它是否可以与gunicorn一起运行。一切正常,尽管我的网站看起来不像预期的那样,但这就是docker的全部内容了吗?
截至目前,我的网站在经典版本中看起来还不错:
(try_django) bash-3.2$ python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
October 15, 2020 - 18:31:48
Django version 2.2, using settings 'try_django.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
现在我正试图部署该项目。
我可以看到图像创建得很好:
simple-dj-docker latest 11554361b373 17 minutes ago 1.24GB
下一步是运行:
docker run -it -p 80:8888 simple-dj-docker
作为回报,我得到:
[2020-10-15 18:13:15 +0000] [6] [INFO] Starting gunicorn 20.0.4
[2020-10-15 18:13:15 +0000] [6] [INFO] Listening at: http://0.0.0.0:8888 (6)
[2020-10-15 18:13:15 +0000] [6] [INFO] Using worker: sync
[2020-10-15 18:13:15 +0000] [8] [INFO] Booting worker with pid: 8
[2020-10-15 18:13:15 +0000] [8] [ERROR] Exception in worker process
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
worker.init_process()
File "/usr/local/lib/python3.8/site-packages/gunicorn/workers/base.py", line 119, in init_process
self.load_wsgi()
File "/usr/local/lib/python3.8/site-packages/gunicorn/workers/base.py", line 144, in load_wsgi
self.wsgi = self.app.wsgi()
File "/usr/local/lib/python3.8/site-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/usr/local/lib/python3.8/site-packages/gunicorn/app/wsgiapp.py", line 49, in load
return self.load_wsgiapp()
File "/usr/local/lib/python3.8/site-packages/gunicorn/app/wsgiapp.py", line 39, in load_wsgiapp
return util.import_app(self.app_uri)
File "/usr/local/lib/python3.8/site-packages/gunicorn/util.py", line 358, in import_app
mod = importlib.import_module(module)
File "/usr/local/lib/python3.8/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
File "<frozen importlib._bootstrap>", line 991, in _find_and_load
File "<frozen importlib._bootstrap>", line 961, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
File "<frozen importlib._bootstrap>", line 991, in _find_and_load
File "<frozen importlib._bootstrap>", line 973, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'try_django'
[2020-10-15 18:13:15 +0000] [8] [INFO] Worker exiting (pid: 8)
[2020-10-15 18:13:15 +0000] [6] [INFO] Shutting down: Master
[2020-10-15 18:13:15 +0000] [6] [INFO] Reason: Worker failed to boot.
我的树:
(try_django) bash-3.2$ tree
.
├── Dockerfile
├── Pipfile
├── Pipfile.lock
├── README.md
├── app
│ ├── blog
│ │ ├── __init__.py
│ │ ├── admin.py
│ │ ├── apps.py
│ │ ├── forms.py
│ │ ├── migrations
│ │ │ ├── 0001_initial.py
│ │ │ ├── 0002_contactmessage.py
│ │ │ ├── 0003_auto_20200910_1608.py
│ │ │ ├── 0004_auto_20200911_0410.py
│ │ │ ├── 0005_homecontactmessage.py
│ │ │ ├── 0006_auto_20200922_1940.py
│ │ │ └── __init__.py
│ │ ├── models.py
│ │ ├── templates
│ │ │ └── blog
│ │ │ ├── create.html
│ │ │ ├── delete.html
│ │ │ ├── detail.html
│ │ │ ├── form.html
│ │ │ ├── list-inline.html
│ │ │ ├── list.html
│ │ │ └── update.html
│ │ ├── tests.py
│ │ ├── urls.py
│ │ └── views.py
│ ├── db.sqlite3
│ ├── manage.py
│ ├── rs_blog
│ │ ├── __init__.py
│ │ ├── admin.py
│ │ ├── apps.py
│ │ ├── forms.py
│ │ ├── migrations
│ │ │ ├── 0001_initial.py
│ │ │ ├── 0002_contactmessage.py
│ │ │ ├── 0003_auto_20200911_0432.py
│ │ │ ├── 0004_auto_20200922_1940.py
│ │ │ └── __init__.py
│ │ ├── models.py
│ │ ├── templates
│ │ │ ├── form_studio.html
│ │ │ └── rs_blog
│ │ │ ├── create.html
│ │ │ ├── delete.html
│ │ │ ├── detail.html
│ │ │ ├── form.html
│ │ │ ├── list-inline.html
│ │ │ ├── list.html
│ │ │ └── update.html
│ │ ├── tests.py
│ │ ├── urls.py
│ │ └── views.py
│ ├── searches
│ │ ├── __init__.py
│ │ ├── admin.py
│ │ ├── apps.py
│ │ ├── migrations
│ │ │ ├── 0001_initial.py
│ │ │ └── __init__.py
│ │ ├── models.py
│ │ ├── templates
│ │ │ └── searches
│ │ │ └── view.html
│ │ ├── tests.py
│ │ └── views.py
│ ├── static
│ │ ├── css
│ │ │ ├── style_basestudio.css
│ │ │ ├── style_basetech.css
│ │ │ └── style_home.css
│ │ ├── images
│ │ │ ├── 1120.jpg
│ │ │ ├── Colorado.jpg
│ │ │ ├── IMG_9646.jpg
│ │ │ ├── beer-film.jpg
│ │ │ ├── clouds-sm.jpg
│ │ │ ├── clouds.jpg
│ │ │ ├── clouds.png
│ │ │ ├── frosty-range.jpg
│ │ │ ├── logo-dark.png
│ │ │ ├── logo.png
│ │ │ ├── logo2dark.png
│ │ │ ├── moon-sm.jpg
│ │ │ ├── moon.jpg
│ │ │ ├── moon.png
│ │ │ └── stars.jpg
│ │ └── js
│ │ └── home.js
│ ├── templates
│ │ ├── about.html
│ │ ├── about_studio.html
│ │ ├── about_tech.html
│ │ ├── base.html
│ │ ├── basestudio.html
│ │ ├── basetech.html
│ │ ├── contact_us.html
│ │ ├── form.html
│ │ ├── form_studio.html
│ │ ├── form_tech.html
│ │ ├── gallery.html
│ │ ├── home.html
│ │ ├── home_navbar.html
│ │ ├── js.html
│ │ ├── reesonstudio.html
│ │ ├── reesontech.html
│ │ └── rs_navbar.html
│ └── try_django
│ ├── __init__.py
│ ├── forms.py
│ ├── settings.py
│ ├── urls.py
│ ├── views.py
│ └── wsgi.py
├── static_cdn_test
│ ├── blank
│ │ └── blank.txt
│ ├── media
│ │ └── image
│ │ ├── Desk\ Edited.jpg
│ │ ├── Desk_Edited.jpg
│ │ ├── IMG_0581.jpg
│ │ ├── IMG_3435.HEIC
│ │ ├── IMG_9305.jpg
│ │ ├── IMG_9379.jpg
│ │ ├── IMG_9427.jpg
│ │ ├── IMG_9925.JPG
│ │ ├── Screen_Shot_2020-08-11_at_11.43.03_PM.png
│ │ ├── Screen_Shot_2020-08-11_at_11.43.03_PM_CCdYJ6B.png
│ │ ├── Screen_Shot_2020-08-11_at_11.43.03_PM_CCdYJ6B_FmfxW03.png
│ │ ├── Screen_Shot_2020-08-11_at_11.43.03_PM_CCdYJ6B_St4aVdj.png
│ │ └── Screen_Shot_2020-08-11_at_11.43.14_PM.png
│ └── static
│ ├── admin
│ │ ├── css
│ │ │ ├── autocomplete.css
│ │ │ ├── base.css
│ │ │ ├── changelists.css
│ │ │ ├── dashboard.css
│ │ │ ├── fonts.css
│ │ │ ├── forms.css
│ │ │ ├── login.css
│ │ │ ├── responsive.css
│ │ │ ├── responsive_rtl.css
│ │ │ ├── rtl.css
│ │ │ ├── vendor
│ │ │ │ └── select2
│ │ │ │ ├── LICENSE-SELECT2.md
│ │ │ │ ├── select2.css
│ │ │ │ └── select2.min.css
│ │ │ └── widgets.css
│ │ ├── fonts
│ │ │ ├── LICENSE.txt
│ │ │ ├── README.txt
│ │ │ ├── Roboto-Bold-webfont.woff
│ │ │ ├── Roboto-Light-webfont.woff
│ │ │ └── Roboto-Regular-webfont.woff
│ │ ├── img
│ │ │ ├── LICENSE
│ │ │ ├── README.txt
│ │ │ ├── calendar-icons.svg
│ │ │ ├── gis
│ │ │ │ ├── move_vertex_off.svg
│ │ │ │ └── move_vertex_on.svg
│ │ │ ├── icon-addlink.svg
│ │ │ ├── icon-alert.svg
│ │ │ ├── icon-calendar.svg
│ │ │ ├── icon-changelink.svg
│ │ │ ├── icon-clock.svg
│ │ │ ├── icon-deletelink.svg
│ │ │ ├── icon-no.svg
│ │ │ ├── icon-unknown-alt.svg
│ │ │ ├── icon-unknown.svg
│ │ │ ├── icon-viewlink.svg
│ │ │ ├── icon-yes.svg
│ │ │ ├── inline-delete.svg
│ │ │ ├── search.svg
│ │ │ ├── selector-icons.svg
│ │ │ ├── sorting-icons.svg
│ │ │ ├── tooltag-add.svg
│ │ │ └── tooltag-arrowright.svg
│ │ └── js
│ │ ├── SelectBox.js
│ │ ├── SelectFilter2.js
│ │ ├── actions.js
│ │ ├── actions.min.js
│ │ ├── admin
│ │ │ ├── DateTimeShortcuts.js
│ │ │ └── RelatedObjectLookups.js
│ │ ├── autocomplete.js
│ │ ├── calendar.js
│ │ ├── cancel.js
│ │ ├── change_form.js
│ │ ├── collapse.js
│ │ ├── collapse.min.js
│ │ ├── core.js
│ │ ├── inlines.js
│ │ ├── inlines.min.js
│ │ ├── jquery.init.js
│ │ ├── popup_response.js
│ │ ├── prepopulate.js
│ │ ├── prepopulate.min.js
│ │ ├── prepopulate_init.js
│ │ ├── timeparse.js
│ │ ├── urlify.js
│ │ └── vendor
│ │ ├── jquery
│ │ │ ├── LICENSE.txt
│ │ │ ├── jquery.js
│ │ │ └── jquery.min.js
│ │ ├── select2
│ │ │ ├── LICENSE.md
│ │ │ ├── i18n
│ │ │ │ ├── ar.js
│ │ │ │ ├── az.js
│ │ │ │ ├── bg.js
│ │ │ │ ├── ca.js
│ │ │ │ ├── cs.js
│ │ │ │ ├── da.js
│ │ │ │ ├── de.js
│ │ │ │ ├── el.js
│ │ │ │ ├── en.js
│ │ │ │ ├── es.js
│ │ │ │ ├── et.js
│ │ │ │ ├── eu.js
│ │ │ │ ├── fa.js
│ │ │ │ ├── fi.js
│ │ │ │ ├── fr.js
│ │ │ │ ├── gl.js
│ │ │ │ ├── he.js
│ │ │ │ ├── hi.js
│ │ │ │ ├── hr.js
│ │ │ │ ├── hu.js
│ │ │ │ ├── id.js
│ │ │ │ ├── is.js
│ │ │ │ ├── it.js
│ │ │ │ ├── ja.js
│ │ │ │ ├── km.js
│ │ │ │ ├── ko.js
│ │ │ │ ├── lt.js
│ │ │ │ ├── lv.js
│ │ │ │ ├── mk.js
│ │ │ │ ├── ms.js
│ │ │ │ ├── nb.js
│ │ │ │ ├── nl.js
│ │ │ │ ├── pl.js
│ │ │ │ ├── pt-BR.js
│ │ │ │ ├── pt.js
│ │ │ │ ├── ro.js
│ │ │ │ ├── ru.js
│ │ │ │ ├── sk.js
│ │ │ │ ├── sr-Cyrl.js
│ │ │ │ ├── sr.js
│ │ │ │ ├── sv.js
│ │ │ │ ├── th.js
│ │ │ │ ├── tr.js
│ │ │ │ ├── uk.js
│ │ │ │ ├── vi.js
│ │ │ │ ├── zh-CN.js
│ │ │ │ └── zh-TW.js
│ │ │ ├── select2.full.js
│ │ │ └── select2.full.min.js
│ │ └── xregexp
│ │ ├── LICENSE.txt
│ │ ├── xregexp.js
│ │ └── xregexp.min.js
│ └── blank.txt
├── try_django.sublime-project
└── try_django.sublime-workspace
我的Dockerfile:
# Base Image
FROM python:3.8
# create and set working directory
RUN mkdir /app
WORKDIR /app
# Add current directory code to working directory
ADD . /app/
# set default environment variables
ENV PYTHONUNBUFFERED 1
ENV LANG C.UTF-8
ENV DEBIAN_FRONTEND=noninteractive
# set project environment variables
# grab these via Python's os.environ
# these are 100% optional here
ENV PORT=8888
# Install system dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
tzdata \
python3-setuptools \
python3-pip \
python3-dev \
python3-venv \
git \
&& \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# install environment dependencies
RUN pip3 install --upgrade pip
RUN pip3 install pipenv
# Install project dependencies
RUN pipenv install --skip-lock --system --dev
EXPOSE 8888
CMD gunicorn try_django.wsgi:application --bind 0.0.0.0:$PORT
请有人救我一命,大声笑,我觉得我已经很接近要像我的个人网站一样启动并运行它了,这是我的编码作品集中的第一个项目之一,但是哇,这最后一周想弄清楚部署是残酷的。