我为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
中的SAME相同的当我从命令行连接数据库时,我可以看到有用户' admin'。 (当然是当地的) 没有docker,它不会给出任何错误。那么我对码头工作的错误呢?
PS: 在我以前的项目中,我使用env_file而不是使用docker-compose.yml中的environment部分将env文件传递给docker。 我也尝试过,但它不起作用。
我正在寻找很长一段时间。 谢谢!
答案 0 :(得分:2)
django配置中的主机名应该是docker-compose.yml文件中指定的服务的名称。在你的情况下,主持人应该是' db'而不是' postgres'。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'myproject',
'USER': 'admin',
'PASSWORD': 'admin_pass',
'HOST': 'db',
'PORT': '',
}
}
答案 1 :(得分:0)
好的,过了一会儿,在帮助下,我想通了。在我的系统上运行了一个本地 postgres。而用户" admin"我一直在使用本地postgres。 我删除了我的data / db文件夹并重命名用户然后它工作了! 然后,我再次删除了db文件夹,将用户重命名为" admin"再次,但停止了当地的postgres,它也工作!
由于
答案 2 :(得分:0)
也花了几个小时来解决这个错误。
对于Windows 10,它是文件中的错误路径
\postgres\docker-entrypoint-initdb.d
(此文件夹位于Docker项目内)
原来是
#!/bin/env bash
我做了
#!/bin/bash
此容器运行良好,而本地本地PostgreSQL没有问题。
答案 3 :(得分:0)
我有同样的问题。
我以这种方式解决了该问题:
如果您正在使用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