簡體   English   中英

如何使用相同的 DATABASE_HOST 從 dockerized django 和非 dockerized django 將 django 應用程序連接到 dockerized postgres db

[英]How to connect a django app to a dockerized postgres db, both from a dockerized django and non-dockerized django using same DATABASE_HOST

我有一個 postgres 容器docker-compose.yml

services:
  db:
    container_name: db
    expose:
      - "5432"
    ports:
      - 5432:5432
    volumes:
      - postgres_data:/var/lib/postgresql/data/

還有一個帶有settings.py的 django 項目:

DATABASES = {
    'default': {
        'HOST': os.environ.get('POSTGRES_HOST', '127.0.0.1')
        # etc
    }
}

.env

POSTGRES_HOST_DJANGO=db

當我使用manage.py runserver 0.0.0.0:8000在本地運行我的 django 應用程序時,它使用默認的POSTGRES_HOST=127.0.0.1連接良好,因為.env沒有加載。

我有時也在容器中運行我的 django 應用程序:

docker-compose.yml

   web:
    #restart: unless-stopped
    build: .
    env_file: .env
    command: bash -c "cd /app/src/ && python manage.py runserver 0.0.0.0:8000
    volumes: 
      - .:/app
    ports:
      - 8000:8000
    links: 
      - db:db

但是它使用.env文件並與POSTGRES_HOST=db連接

如果我嘗試使用POSTGRES_HOST=db連接本地運行的 django 應用程序,它將失敗:

django.db.utils.OperationalError:無法將主機名“db”轉換為地址:名稱或服務未知

如果我嘗試在POSTGRES_HOST=127.0.0.1的容器中運行 django 應用程序,它會以同樣的方式失敗。

我怎樣才能讓他們使用相同的POSTGRES_HOST

問題似乎出在網絡配置中。 我沒有看到一個。

docker-compose 的默認行為是它為每個撰寫文件創建一個網絡 - 默認情況下,名稱是帶有“_default”的文件夾名稱。

Django App在不同的網絡,Postgres在不同的網絡

如果您的 Django 應用程序和 Postgres 容器位於不同的 docker-compose 文件中,則使用容器名稱來解析主機將不起作用(默認情況下,可以使用自定義網絡配置完成),因為它們位於兩個不同的網絡中。

由於您已經完成了端口綁定,您可以通過在容器中提供主機的私有 ip 和端口 5432 來直接訪問 Postgres,這樣通信是通過主機網絡進行的。

如果您發現需要讓容器直接相互通信,請確保它們在同一個 docker 網絡上

我想出了怎么做。 不是讓他們使用相同的變量,而是讓他們根據運行方式讀取不同的變量。 所以:

來自docker-compose.yml

   web:
    build: .
    command: bash -c "cd /app/src/ && python manage.py runserver 0.0.0.0:8000
    env_file: .env
    environment:
      POSTGRES_HOST: db  # takes precendent over .env file

.env中:

POSTGRES_HOST=127.0.0.1

現在,當我使用./manage.py runserver在本地運行時,它使用 .env 文件並在127.0.0.1:5342正確連接到 db 容器

但是,如果我運行docker-compose up web ,即使它也讀取 .env 文件,撰寫文件中提供的環境變量優先,它使用POSTGRES_HOST: db並連接到 db 容器!

暫無
暫無

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

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