我有一个项目需要开始
Docker
。我已经成功创建了images
、containers
和Django
的NGINX
和postgreSQL
,因此项目可以正确启动。我注意到,当我尝试登录管理面板时,Django 会引发 OperationalError at /admin/login/ connection to server at "database" (192.168.144.2), port 5432 failed: fe_sendauth: no password supplied
。没有nginx
一切工作正常,但现在我无法访问数据库。据我了解这个问题,我需要改变nginx.config
,但我几乎尝试了所有方法,但仍然无法解决这个问题。看起来 postgreSQL
可能看不到我的用户。我的代码片段如下。
uwsgi.ini
[uwsgi]
wsgi-file = config/wsgi.py
strict = true
socket = :8000
protocol = http
master = true
no-orphans = true
die-on-term = true
lazy-apps = true
processes = 4
threads = 8
enable-threads = true
max-requests = 500
reload-on-rss = 1024
worker-reload-mercy = 60
harakiri = 60
harakiri-verbose = true
vacuum = true
post-buffering = 1048576
buffer-size = 65535
nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
include /etc/nginx/uwsgi_params;
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://django: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;
}
}
}
Dockerfile
FROM python:3.10.0-alpine
RUN apk add postgresql-client build-base postgresql-dev linux-headers pcre-dev
WORKDIR /movies_admin
COPY requirements.txt .
RUN pip install -r requirements.txt --no-cache-dir
EXPOSE 8000
COPY movies_admin .
docker-compose.yml
version: '3.8'
services:
django:
build:
context: .
volumes:
- "./movies_admin:/movies_admin"
environment:
- DB_HOST=database
- POSTGRES_DB=movies_database
- POSTGRES_USER=app
- POSTGRES_PASSWORD=123qwe
- SECRET_KEY='django-insecure-8h%wg+drqmqjkw$8wm7#)#%*fb3b%(-e!-kbdth^#9u)23u!48'
command:
sh -c "uwsgi --ini /movies_admin/uwsgi.ini"
depends_on:
- database
database:
image: postgres:16
environment:
- POSTGRES_DB=movies_database
- POSTGRES_USER=app
- POSTGRES_PASSWORD=123qwe
volumes:
- $HOME/postgresql/data:/var/lib/postgresql/data
nginx:
image: nginx:latest
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
ports:
- "80:80"
depends_on:
- django
组件/database.py
import os
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.environ.get('DB_NAME'),
'USER': os.environ.get('DB_USER'),
'PASSWORD': os.environ.get('DB_PASSWORD'),
'HOST': os.environ.get('DB_HOST', 'database'), # name of docker container with postgresql
'PORT': os.environ.get('DB_PORT', 5432),
'OPTIONS': {
'options': '-c search_path=public,content'
}
}
}
附注我还认为这个想法可能在
ports
中使用 docker-compose.yml
,但当我阅读 dos 时,最佳实践是隐藏 django
和 postgresql
端口并仅通过 nginx
连接。
您的问题似乎与 Docker 或 NGINX 无关。再次阅读错误:
no password supplied
- 这意味着您连接正常,但数据库未收到密码
components/database.py
正在调用os.environ.get('DB_PASSWORD')
,但是你在哪里设置这个环境变量呢?
在
docker-compose.yml
中,查看您的 django
服务环境变量。您正在设置一个名为 POSTGRES_PASSWORD
、not DB_PASSWORD
的变量,这正是您的 django
应用程序正在寻找的内容。
解决方案
将
django
中的 docker-compose.yml
服务读入 POSTGRES_PASSWORD
而不是当前的 DB_PASSWORD
。