【问题标题】:Docker - psql: django.db.utils.OperationalError: FATAL: role "admin" does not existDocker - psql:django.db.utils.OperationalError:致命:角色“管理员”不存在
【发布时间】:2018-09-18 05:44:49
【问题描述】:

我已经为我的 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 做错了什么?

PS: 在我以前的项目中,我使用 env_file 将 env 文件传递​​给 docker,而不是使用 docker-compose.yml 中的 environment 部分 我也尝试过,但没有奏效。

我找了很久。 谢谢!

【问题讨论】:

  • 你迁移数据库了吗?
  • 当我运行命令 python manage.py migrate 时,它​​会引发同样的错误。

标签: django postgresql docker docker-compose


【解决方案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

【讨论】:

    【解决方案2】:

    还花了几个小时来解决这个错误。 对于 Windows 10,这是文件中的错误路径 \postgres\docker-entrypoint-initdb.d(此文件夹在您的 Docker 项目中)

    原来是

    #!/bin/env bash
    

    我做了

    #!/bin/bash
    

    在此容器正常工作后,本地本地 PostgreSQL 没有问题。

    【讨论】:

      【解决方案3】:

      好的,过了一会儿,在帮助下,我想通了。我的系统上有一个 local postgres 正在运行。我猜,用户“admin”一直在使用本地 postgres。 我删除了我的 data/db 文件夹并重命名了用户,然后它就起作用了! 然后,我再次删除了db文件夹,再次将用户重命名为“admin”,但是停止了本地postgres,它也起作用了!

      谢谢

      【讨论】:

      • 我执行了以下步骤来摆脱本地 postgres(在 MacOS 上):1)brew uninstall postgresql 2)rm -rf rm -rf /usr/local/var/postgres 3)rm -rf .psql.local .psql_history .psqlrc.local l.psqlrc .pgpass
      【解决方案4】:

      django 配置中的主机名应该是 docker-compose.yml 文件中指定的服务名称。在您的情况下,主机应该是“db”而不是“postgres”。

      DATABASES = {
          'default': {
              'ENGINE': 'django.db.backends.postgresql_psycopg2',
              'NAME': 'myproject',
              'USER': 'admin',
              'PASSWORD': 'admin_pass',
              'HOST': 'db',
              'PORT': '',
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-28
        • 1970-01-01
        • 1970-01-01
        • 2023-01-26
        • 2011-09-26
        • 1970-01-01
        • 2013-02-24
        • 2017-04-16
        相关资源
        最近更新 更多