
[英]django.db.utils.OperationalError: FATAL: role “django” does not exist
[英]Docker - psql: django.db.utils.OperationalError: FATAL: role “admin” does not exist
我已经为我的 Django 项目配置了 docker 和 postgres。
当我执行python manage.py runserver 0:8000
,它给了我这个错误: django.db.utils.OperationalError: FATAL: role "admin" does not exist
但是,我在以前的项目中使用了相同的配置,并且一切似乎都很好。
这是我的 docker-compose.yml 文件
version: '3'
services:
db:
image: postgres
environment:
- POSTGRES_DB=myproject
- POSTGRES_USER=admin
- POSTGRES_PASSWORD=admin_pass
container_name: myproject_postgress
volumes:
- ./data/db:/var/lib/postgresql/data
myproject:
build: ./myproject
container_name: myproject
env_file:
- .env
command: "tail -f /dev/null"
volumes:
- ./myproject:/web
ports:
- "8000:8000"
depends_on:
- db
links:
- db:postgres
environment:
- DJANGO_SETTINGS_MODULE=myproject.settings.local
这是我的设置文件中的数据库部分:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'myproject',
'USER': 'admin',
'PASSWORD': 'admin_pass',
'HOST': 'postgres',
'PORT': '',
}
}
这些与 docker-compose.yml 中的相同
当我从命令行连接我的数据库时,我可以看到有用户“admin”。 (当然是本地的)没有 docker,它不会给出任何错误。 那么我对码头工人做错了什么?
PS:在我之前的项目中,我使用 env_file 而不是使用 docker-compose.yml 中的 environment 部分将 env 文件传递给 docker 我也尝试过,但它不起作用。
我找了很久。 谢谢!
django 配置中的主机名应该是 docker-compose.yml 文件中指定的服务的名称。 在您的情况下,主机应该是“db”而不是“postgres”。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'myproject',
'USER': 'admin',
'PASSWORD': 'admin_pass',
'HOST': 'db',
'PORT': '',
}
}
好的,过了一会儿,在帮助下,我想通了。 我的系统上有一个本地postgres 正在运行。 我猜用户“admin”一直用于本地 postgres。 我删除了我的 data/db 文件夹并重命名用户然后它工作了! 然后,我再次删除了 db 文件夹,再次将用户重命名为“admin”,但停止了本地 postgres,它也有效!
谢谢
还花了几个小时来解决这个错误。 对于 Windows 10,它是文件\\postgres\\docker-entrypoint-initdb.d
中的错误路径(此文件夹在您的 Docker 项目中)
原来是
#!/bin/env bash
我做了
#!/bin/bash
在此容器正常工作后,本地本地 PostgreSQL 没有问题。
我有同样的问题。
我是这样修复的:
如果您使用的是 Docker,并且它是侦听 5432 端口,那么您也可以终止正在侦听的其他进程。
为此,请键入以下命令以查看哪些进程正在使用端口 5432:
$ lsof -i:5432
这将如下所示:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
com.docke 15178 andre.carvalho 86u IPv6 0xb128ac87cd34cc69 0t0 TCP *:postgresql (LISTEN)
postgres 16620 andre.carvalho 7u IPv6 0xb128ac87dc50c569 0t0 TCP localhost:postgresql (LISTEN)
postgres 16620 andre.carvalho 8u IPv4 0xb128ac87d2378541 0t0 TCP localhost:postgresql (LISTEN)
在这之后,这很容易。
只需使用以下命令杀死另一个进程:
kill -9 16620
请注意,该进程由 PID 标识。
我希望它有帮助:D
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.