![](/img/trans.png)
[英]How to connect locally hosted Django app to Dockerized Postgres database
[英]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.