Docker - psql:django.db.utils.OperationalError:FATAL:role" admin"不存在

时间:2018-04-08 20:40:38

标签: django postgresql docker docker-compose

我为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。 我也尝试过,但它不起作用。

我正在寻找很长一段时间。 谢谢!

4 个答案:

答案 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