Docker - psql:django.db.utils.OperationalError:致命错误:角色“admin”不存在。

4

我已经为我的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的情况下,它不会出现任何错误。那么我在docker方面做错了什么呢?

备注: 在我的之前的项目中,我使用env_file而不是在docker-compose.yml的environment部分传递env文件。 我也尝试过这种方法,但它没有起作用。

我已经寻找很长时间了。 谢谢!


你迁移了数据库吗? - JPG
当我运行命令python manage.py migrate时,它会引发相同的错误。 - Öykü
4个回答

4
好的,一段时间后,在得到帮助后,我想通了。原来我的系统上运行着一个本地的PostgreSQL数据库。而用户“admin”已经被用于本地的PostgreSQL数据库。我删除了data/db文件夹并重命名了用户,这样就成功了!然后,我再次删除了db文件夹,将用户重新命名为“admin”,但是停止了本地的PostgreSQL,也成功了!感谢。

1
我执行了以下步骤来卸载本地的postgres(在MacOS上): 1)brew uninstall postgresql 2)rm -rf /usr/local/var/postgres 3)rm -rf .psql.local .psql_history .psqlrc.local l.psqlrc .pgpass - Greg Holst

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
我遇到了同样的问题。
我是这样解决的:
如果你正在使用 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

我也遇到了这个问题,你的解决方案解决了我的问题。你知道那些进程是什么吗?我知道你已经发布答案有一段时间了,但我希望如果可能的话,你能提供一些见解。 - Patrick Da Silva

0

我为这个错误花了几个小时。

对于Windows 10,文件中的路径是错误的:\postgres\docker-entrypoint-initdb.d(此文件夹位于您的Docker项目内)

最初它是

#!/bin/env bash

我做了

#!/bin/bash

在这个容器中,使用本地的PostgreSQL时没有任何问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接