【发布时间】:2018-06-23 10:20:25
【问题描述】:
我正在 docker 中运行 Django 项目。我有 3 个 docker 容器。
- 对于 Django 应用程序
- 对于 Postgres
- 对于 Nginx
我的docker-compose.yml 文件如下
version: "3"
services:
db:
restart: always
container_name: tts-db
image: postgres:9.6
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=tts
expose:
- "5432"
nginx:
image: nginx:latest
container_name: tts-nginx
ports:
- "8000:8000"
volumes:
- ./nginx/site-enabled:/etc/nginx/conf.d
depends_on:
- web
web:
build: .
container_name: tts-app
environment:
- DATABASE=db
- DEBUG=False
- STATICFILES_STORAGE=whitenoise.storage.CompressedManifestStaticFilesStorage
depends_on:
- db
expose:
- "8888"
entrypoint: ./entry_point.sh
command: gunicorn urdu_tts.wsgi:application -w 2 -b :8888
restart: always
在我的 django 应用程序中,我需要访问主机地址。我使用了在本地主机中工作的request.get_host()。当我在 Docker 中运行它时,我得到像 http://web/media/voice/voice.wav 这样的 URL。我的nginx配置如下。
upstream web {
ip_hash;
server web:8888;
}
server {
location ^/static/ {
autoindex on;
alias /static/;
}
location ~ ^/media/?(.*)$ {
try_files /media/$1 /mediafiles/$1 =404;
}
location / {
proxy_pass http://web;
client_max_body_size 20m;
}
listen 8000;
server_name localhost;
}
如何在 Docker 中获取服务器 url?
【问题讨论】:
-
或许设置一个名为 SERVER_URL 的环境变量并通过您的设置在代码中访问它?
-
在这种情况下,我每次在任何机器上运行时都必须设置它。
-
但我想,无论您将代码部署到哪个服务器,您的 URL 都将保持不变?
-
我还没有部署到任何实时服务器。这将是一个开源项目,因为任何人都可以在他们的机器上运行它。在环境变量中设置服务器 url 将解决我的问题,但我想要一个动态的解决方案。
-
简单地说,您可以在撰写文件中添加一个
hostname字段,以便 django 以正确的方式使用主机名。例如。hostname: yourserver.com
标签: python django docker nginx docker-compose