Django应用程序中连接到localhost上的PostgreSQL的问题



我正在使用Docker运行我的Django应用程序,其中有多个映像:PostgreSQL、cele_worker、cele_beat和Django_app。除了cele_beat之外,所有的都工作得很好。我正在使用这个命令来构建docker:

docker-compose -f docker-compose.yml up -d --build

当我打开Docker Desktop时,我看到它重新启动了所有图像,在几秒钟内一切正常,然后它退出芹菜节拍并返回芹菜节拍图像,并返回以下错误:

[2022-10-13 15:34:59,440: WARNING/MainProcess] could not connect to server: Connection refused
Is the server running on host "127.0.0.1" and accepting
TCP/IP connections on port 5432?

我尝试了许多在StackOverflow和其他页面上找到的解决方案,但都没有成功。5张图像中有4张运行良好。当点击PostgreSQL图像时,我看到以下状态:

2022-10-13 13:27:04.195 UTC [1] LOG:  database system is ready to accept connections

docker-compose.yml

version: '3.8'
services:
db:
image: postgres:14.0-alpine
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=PF23_admin
- POSTGRES_DB=postgres
container_name: docerized_app_db_postgresql_dev

app:
build:
context: ./backend
dockerfile: Dockerfile
restart: always
command: python manage.py runserver 0.0.0.0:8000
volumes:
- ./backend/:/usr/src/backend/
ports:
- 8000:8000
env_file:
- ./.env
depends_on:
- db
container_name: docerized_app_django_app_dev

redis:
image: redis:7-alpine
ports:
- "6379:6379" 
container_name: docerized_app_redis_dev

celery_worker:
restart: always
build:
context: ./backend
command: celery -A docerized_app_settings worker --loglevel=info --logfile=logs/celery.log
volumes:
- ./backend:/usr/src/backend
env_file:
- ./.env
depends_on:
- db
- redis
- app
container_name: docerized_app_celery_worker_dev

celery-beat:
build: ./backend
command: celery -A docerized_app_settings beat -l info
volumes:
- ./backend:/usr/src/backend
env_file:
- ./.env
depends_on:
- db
- redis
- app
container_name: docerized_app_celery_beat_dev
volumes:
postgres_data:

Docker对我来说是新的,所以我不知道如何修复它。当我的应用程序在终端上运行时(使用conda环境和ubuntu(,一切都很好,我对PostgreSQL连接没有问题。

也许这是一个愚蠢的错误,我没有意识到。任何帮助都将不胜感激。

因此可能存在两个问题。

  1. docker容器中的postgres连接字符串应该使用pg实例(db(的容器名作为主机名。(可能是docerized_app_db_postgresql_dev。我从未明确指定过容器名称,所以我不能100%确定它是否会使用该名称。(
  2. 默认情况下,postgres配置不会只侦听外部连接的本地主机,因此在postgres容器中,您必须将postgres.conf更改为侦听"*"而不是localhost

https://www.bigbinary.com/blog/configure-postgresql-to-allow-remote-connection

最新更新