【问题标题】:Impossible to connect to my postgreSQL Database无法连接到我的 postgreSQL 数据库
【发布时间】:2020-08-14 13:03:05
【问题描述】:

我正在使用 docker,并且我已经开始了一个新项目。 我在 Django 中有一个后端,我想使用一个 postgreSQL 数据库。

我无法使用 Django 或 PGAdmin 连接到我的数据库。 This is what I Got when I try to connect to my database (with Django or with PGAdmin)

他是我的 docker-compose 文件的一部分:

services:
db:
    image: postgres
    container_name: db_wishlist
    restart: always
    volumes:
    - ./postgres-data-wishlist:/var/lib/postgresql/data
    env_file:
        - env/base/db.env
        - env/dev/db.env
    ports:
    - "5432:5432"
    networks:
        wishlist:
            aliases:
                - db

pgadmin:
    image: dpage/pgadmin4
    container_name: pgadmin 
    depends_on:
        - db
    ports:
        - "5051:80"
    env_file:
        - env/base/db.env
        - env/dev/db.env
    environment:
        PGADMIN_DEFAULT_EMAIL: pgadmin4@pgadmin.org
        PGADMIN_DEFAULT_PASSWORD: root
    restart: always
    networks:
        wishlist:
            aliases:
                - pgadmin

api:
    container_name: backend
    build:
        context: ..
        dockerfile: Docker/Dockerfiles/Django
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
        - ../Django/:/api
    ports:
        - "8000:8000"
    env_file:
        - env/base/db.env
        - env/dev/db.env
    depends_on:
    - db
    links:
    - db:db
    networks:
        wishlist:
            aliases:
                - api

这是我的 db.env:

POSTGRES_DB=wishlist
POSTGRES_USER=maxdal1
POSTGRES_PASSWORD=demo

这是我在 Django 中的 settings.py:

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.postgresql',
    'NAME': 'wishlist',
    'USER': 'maxdal1',
    'PASSWORD': 'demo',
    'HOST': 'db',
    'PORT': 5432,
}

}

这是我尝试使用 PGAdmin 连接到我的数据库时的附加屏幕截图:

Error with PGAdmin

我检查了有关此错误的所有讨论,但我无法弄清楚。

你能帮帮我吗?

谢谢。

【问题讨论】:

    标签: django database postgresql docker pgadmin


    【解决方案1】:

    您是否尝试过通过环境变量将您的 db 用户传递给 postgres 容器?

    environment:
            POSTGRES_USER: "youruser"
    

    【讨论】:

    • 是的,我已经尝试过了,但它根本不起作用(同样的错误)
    【解决方案2】:

    以下设置适用于我:

    docker-compose.yaml

    services:
    
      postgres:
        image: postgres:10-alpine
        volumes:
          - ./pgdata:/var/lib/postgresql/data/pgdata
        environment:
          - PGDATA=/var/lib/postgresql/data/pgdata
          - POSTGRES_DB=django_db
          - POSTGRES_USER=XXX
          - POSTGRES_PASSWORD=XXX
        ports:
          - 127.0.0.1:5432:5432
        networks:
          - backend
    
      django:
        build:
          context: .
          dockerfile: Dockerfile
        environment:
          - POSTGRES_HOST=postgres
          - POSTGRES_DB=django_db
          - POSTGRES_USER=XXX
          - POSTGRES_PASSWORD=XXX
        volumes:
          - ./staticfiles:/staticfiles
          - ./media:/media
        ports:
          - 8000:8000
        networks:
          - backend
          - frontend
    

    settings.py

    POSTGRES_HOST = os.environ.get('POSTGRES_HOST', 'localhost')
    POSTGRES_DB = os.environ.get('POSTGRES_DB', 'django_db')
    POSTGRES_USER = os.environ.get('POSTGRES_USER', 'XXX')
    POSTGRES_PW = os.environ.get('POSTGRES_PASSWORD', 'XXX')
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': POSTGRES_DB,
            'HOST': POSTGRES_HOST,
            'USER': POSTGRES_USER,
            'PASSWORD': POSTGRES_PW,
            'CONN_MAX_AGE': 120,
        }
    }
    

    django 应用程序的 Dockerfile 指定以下环境变量:

    ENV POSTGRES_DB=$POSTGRES_DB
    ENV POSTGRES_HOST=$POSTGRES_HOST
    ENV POSTGRES_USER=$POSTGRES_USER
    ENV POSTGRES_PASSWORD=$POSTGRES_PASSWORD
    

    你可以像这样运行它:

    $ docker-compose up
    

    或仅通过 docker 运行 postgres 并在本地运行 Django:

    $ docker-compose up postgres
    

    在不同的终端:

    $ ./manage.py runserver
    

    【讨论】:

    • 我把所有东西都改成了像你一样的东西,但我仍然得到相同的结果......我不明白
    • 但这很奇怪,因为当我在数据库设置中手动添加端口(在我的情况下为 5434)时,我收到此错误:" | django.db.utils.OperationalError: could not connect to server: Connection refused backend | Is the server running on host "db" (172.26.0.2) and accepting backend | TCP/IP connections on port 5434?"
    • 您使用的是其他 IP,而不是 localhost 172.0.0.1。我的设置是用于本地开发。
    猜你喜欢
    • 1970-01-01
    • 2017-11-27
    • 2021-02-09
    • 2014-03-30
    • 2013-04-19
    • 2022-12-03
    • 2022-12-05
    • 2012-05-03
    • 1970-01-01
    相关资源
    最近更新 更多