簡體   English   中英

Docker-compose django 應用程序 postgresql 連接拒絕

[英]Docker-compose on a django app postgresql connection refuse

我嘗試對接我的 django 應用程序,這里是我的 docker-compose.yml:

version: '3'

networks:
  mynetwork:
    driver: bridge

services:

  postgres:
    restart: always
    image: postgres:11
    ports:
      - "5432:5432"
    volumes:
      - ./data:/var/lib/postgresql/data

  web:
    build: .
    command: python /Code/core/manage.py runserver 0.0.0.0:8000
    networks:
      - mynetwork

    ports:
      - "8000:8000"

    depends_on:
      - postgres

在我的 django 應用程序中,在我的 settings.py 中,我有這個用於數據庫連接的參數:settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydbname',
        'USER': 'mydbuser',
        'PASSWORD': 'mydbpassword',
        'HOST': '127.0.0.1',
        'PORT': '5432',
        'OPTIONS': {
            'client_encoding': 'UTF8',
        },
    }
}

好吧,當我跑步的時候

docker-compose build

人已經完成了,但是當我這樣做時:

docker-compose up

我收到此錯誤:

conn = _connect(dsn, connection_factory=connection_factory, **kwasync) web_1 | psycopg2.OperationalError:無法連接到服務器:連接被拒絕 web_1 | 服務器是否在主機“127.0.0.1”上運行並接受 web_1 | 端口 5432 上的 TCP/IP 連接?

如何使用我的 docker postgres 圖像管理我的 django 數據庫連接參數?

非常感謝提前

在 docker-compose 中,您可以利用 docker-compose 網絡。 您可以根據容器名稱進行服務到服務的通信。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydbname',
        'USER': 'mydbuser',
        'PASSWORD': 'mydbpassword',
        'HOST': 'postgres',
        'PORT': '5432',
        'OPTIONS': {
            'client_encoding': 'UTF8',
        },
    }
}

在您使用127.0.0.1的連接中,它指的是 web-app 的本地主機,而不是 @Michalk 在評論中提到的 postgress。

您應該將數據庫設置的host更改為postgres ,因為這是docker-compose中的服務名稱。 在內部 docker-compose 將創建一個網絡並將容器附加到它。 docker-compose 中定義的服務名稱將是映射到容器 IP 的 DNS 名稱:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydbname',
        'USER': 'mydbuser',
        'PASSWORD': 'mydbpassword',
        'HOST': 'postgres',
        'PORT': '5432',
        'OPTIONS': {
            'client_encoding': 'UTF8',
        },
    }
}

還要記住, depends_on不會確保在應用容器嘗試訪問數據庫之前完全初始化數據庫。 這也記錄在我分享的鏈接中:

在啟動 web 之前, depends_on不會等待 db 和 redis “准備好” - 僅在它們啟動之前。 如果您需要等待服務准備好,請參閱控制啟動順序以獲取有關此問題的更多信息以及解決該問題的策略。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM