我正在尝试部署django应用程序。
在这个阶段,我似乎无法从我的nginx容器中提供我的静态文件。
我的项目设置为official page
我已将我的图片放入{% static "minimal/theme/assets/img/pic.jpg"%}
目录。
我的网络应用程序的文件结构是:
.
├── Dockerfile
├── docker_django
│ ├── __init__.py
│ ├── apps
│ │ ├── __init__.py
│ │ └── todo
│ │ ├── __init__.py
│ │ ├── admin.py
│ │ ├── fixtures
│ │ │ ├── foodprice.json
│ │ │ ├── location.json
│ │ │ └── menuitem.json
│ │ ├── forms.py
│ │ ├── models.py
│ │ ├── templates
│ │ │ ├── _base-original.html
│ │ │ ├── feedback_template.txt
│ │ │ ├── home-original.html
│ │ │ └── todo
│ │ │ ├── base-original.html
│ │ │ ├── base-template.html
│ │ │ ├── base.html
│ │ │ ├── detail.html
│ │ │ ├── email.html
│ │ │ ├── feedback.html
│ │ │ ├── home.html
│ │ │ ├── home_old.html
│ │ │ ├── location.html
│ │ │ ├── menu.html
│ │ │ ├── results.html
│ │ │ ├── test.html
│ │ │ └── thanks.html
│ │ ├── tests.py
│ │ ├── urls.py
│ │ └── views.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
├── requirements.txt
└── static
├── main.css
└── minimal
└── theme
├── assets
│ ├── css
│ ├── img
│ │ ├── pic1.jpg
└── index.html
在我的nginx容器中,我在启用站点的文件夹中有一个配置文件,如下所示:
server {
listen 80;
server_name localhost;
charset utf-8;
location /static {
alias /usr/src/app/static;
}
location / {
proxy_pass http://web:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
我的settings.py的相关部分的片段如下:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
print "base dir path", BASE_DIR
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))
....
STATIC_URL = '/static/'
# STATICFILES_DIRS = (
# os.path.join(BASE_DIR, 'static'),
# )
# print(STATICFILES_DIRS)
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
production.yml就像:
web:
restart: always
build: ./web
expose:
- "8000"
links:
- postgres:postgres
- redis:redis
env_file: .env
command: /usr/local/bin/gunicorn docker_django.wsgi:application -w 2 -b :8000
nginx:
restart: always
build: ./nginx/
ports:
- "80:80"
volumes:
- /www/static
volumes_from:
- web
links:
- web:web
postgres:
restart: always
image: postgres:latest
ports:
- "5432"
volumes:
- pgdata:/var/lib/postgresql/data/
redis:
restart: always
image: redis:latest
ports:
- "6379"
volumes:
- redisdata:/data
当我在我的机器上本地运行时,静态文件夹中的所有javascript和图像都会加载并完美地运行。当我部署到数字海洋时,静态文件没有被提供,我仍然坚持如何让nginx服务我的静态文件。
有人可以帮忙吗?如果您需要其他信息或代码段,请告诉我,因为我真的想学习如何解决此问题。
答案 0 :(得分:0)
您需要将文件夹/usr/src/app/static
作为卷装入Web容器中。这样,ngnix
就可以访问它。
web:
restart: always
build: ./web
expose:
- "8000"
volumes:
- /usr/src/app/static
links:
- postgres:postgres
- redis:redis
env_file: .env
command: /usr/local/bin/gunicorn docker_django.wsgi:application -w 2 -b :8000
在您的nginx
配置中,您告诉nginx从此目录/usr/src/app/static
提供静态文件,但nginx
容器没有它,除非您链接它。你几乎这样做了,你有volumes_from: web
但web
容器没有装载任何卷,因为你需要添加volumes: - /usr/src/app/static
答案 1 :(得分:0)
使用compose v1语法没有任何意义,这通常使用data-volume-containers(下面的appcode)来完成。这确保您基本上可以根据需要在数据卷容器上设计文件夹结构,然后将其安装在您需要的所有容器中。
这些是您需要做的更改(docker composer v2 syntax)
version: '2'
services:
nginx:
volumes_from:
- appcode:ro
web:
volumes_from:
- appcode:rw
appcode:
image: cogniteev/echo
container_name: dwstorage
command: echo 'Data Volume Container'
volumes:
- appcode:/www/static
volumes:
appcode:
driver: local
(没问,但在这种情况下可能有用) 在这一点上的提示,不要像守护进程那样命名服务,而是给它们语义名称。所以nginx可以成为httpd,web成为app,postgres成为db。
如果用apache替换nginx,则不需要在通信间进行更改,对于postgresql和percona也是如此。