flask无法将postgresql与docker compose连接
我使用docker compose和postgresql构建了一个flask应用程序。 但flask无法连接postgresql。 错误消息:flask无法将postgresql与docker compose连接,postgresql,docker,flask,docker-compose,Postgresql,Docker,Flask,Docker Compose,我使用docker compose和postgresql构建了一个flask应用程序。 但flask无法连接postgresql。 错误消息: conn = _connect(dsn, connection_factory=connection_factory, **kwasync) sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not connect to server: Connection r
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not connect to server: Connection refused
Is the server running on host "postgres-db" (192.168.16.2) and accepting
TCP/IP connections on port 5432?
当我进入docker容器并pingpostgres db
时,它工作得很好。我启动了flask应用程序,它也运行得很好。它只能在我使用docker compose up时无法连接
我的docker撰写文件:
version: '3.7'
services:
postgres-db:
restart: always
image: postgres:11.1-alpine
privileged: true
ports:
- 5432:5432
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: Aa123456
PGDATA: /var/lib/postgresql/data/pgdata
volumes:
- ./db/postgres/data:/var/lib/postgresql/data/pgdata
api:
build:
context: ./api
dockerfile: Dockerfile
volumes:
- './api:/usr/src/app'
ports:
- 5002:5000
environment:
- FLASK_CONFIG=development
- FLASK_ENV=development
- APP_SETTINGS=project.config.DevelopmentConfig
- DATABASE_URL=postgres://postgres:Aa123456@postgres-db:5432/cms
- DATABASE_TEST_URL=postgres://postgres:Aa123456@postgres-db:5432/cms_test
- SECRET_KEY=ZQbn05PDeA7v11
depends_on:
- postgres-db
container_name: api
links:
- postgres-db:postgres-db
nginx:
build:
context: ./nginx
dockerfile: Dockerfile
restart: unless-stopped
ports:
- 8080:8080
depends_on:
- api
- client
client:
build:
context: ./client
dockerfile: Dockerfile
volumes:
- './client:/usr/src/app'
- '/usr/src/app/node_modules'
ports:
- 3008:3000
environment:
- NODE_ENV=development
- REACT_APP_SERVICE_URL=http://localhost:8080
- CHOKIDAR_USEPOLLING=true
depends_on:
- api
您正在经历竞争条件:应用程序正试图在数据库可用之前连接到数据库。这不是Docker独有的问题;如果您的应用程序依赖于外部资源(如数据库服务器),则需要编写代码来处理此类情况 一个简单的解决方案是在数据库可用之前阻止应用程序的启动。在循环中运行类似于
SELECT 1
的操作并等待该操作成功就足够了。执行此操作的示例shell脚本如下所示:
while ! psql -h postgresb-db -c 'select 1'; do
sleep 1
done
如果在flask应用程序中使用sqlachemy,则可以执行类似的操作:
from sqlalchemy import create_engine
from sqlalchemy import exc
import time
while 1:
try:
e = create_engine('postgres://lars@localhost/sandbox')
e.execute('select 1')
except exc.OperationalError:
print('Waiting for database...')
time.sleep(1)
else:
break
print('Connected!')
上述方法可以很好地解决启动竞争条件,但不能处理应用程序运行时数据库服务器重新启动的情况。在这种情况下,您需要优雅地处理断开/重新连接。这需要在代码设计方面做更多的工作,超出了本答案的范围。有关此主题的一些讨论,请参阅。如果您稍等片刻,然后再次尝试
docker compose up-d
,它是否有效?(一个常见的问题是在数据库完全初始化之前启动应用程序。)链接:
是不必要的,并且是一个潜在的复杂性来源,我建议删除它。我的docker compose文件中有依赖项。这是否意味着它将等待数据库就绪,然后运行docker<代码>取决于:-postgres dbDocker对容器内运行的应用程序一无所知。它无法判断数据库服务器是否已准备好为连接提供服务dependens_on
的意思是“等待命名容器启动”,这在实践中几乎没有用处。