'psycopg2.OperationalError: could not connect to server in docker

Trying to launch in docker or locally flask+postresql. Both have the same problem ** File "E:\tz\flask-quiz\app\app.py", line 12, in db.create_all() ** I don't understand why this is happening. Is this problem with postgres connection? Or should i use another command insted of create_all()? There are traceback

 File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 3280, in _wrap_pool_connect
flask-quiz-app-1       |     return fn()
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 310, in connect
flask-quiz-app-1       |     return _ConnectionFairy._checkout(self)
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 868, in _checkout
flask-quiz-app-1       |     fairy = _ConnectionRecord.checkout(pool)
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 476, in checkout
flask-quiz-app-1       |     rec = pool._do_get()
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/pool/impl.py", line 145, in _do_get
flask-quiz-app-1       |     with util.safe_reraise():
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__
flask-quiz-app-1       |     compat.raise_(
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 207, in raise_
flask-quiz-app-1       |     raise exception
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/pool/impl.py", line 143, in _do_get
flask-quiz-app-1       |     return self._create_connection()
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 256, in _create_connection
flask-quiz-app-1       |     return _ConnectionRecord(self)
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 371, in __init__
flask-quiz-app-1       |     self.__connect()
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 665, in __connect
flask-quiz-app-1       |     with util.safe_reraise():
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__
flask-quiz-app-1       |     compat.raise_(
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 207, in raise_
flask-quiz-app-1       |     raise exception
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 661, in __connect
flask-quiz-app-1       |     self.dbapi_connection = connection = pool._invoke_creator(self)
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/create.py", line 590, in connect
flask-quiz-app-1       |     return dialect.connect(*cargs, **cparams)
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 597, in connect
flask-quiz-app-1       |     return self.dbapi.connect(*cargs, **cparams)
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/psycopg2/__init__.py", line 122, in connect
flask-quiz-app-1       |     conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
flask-quiz-app-1       | psycopg2.OperationalError: could not connect to server: Connection refused
flask-quiz-app-1       |        Is the server running on host "postgres" (172.20.0.2) and accepting
flask-quiz-app-1       |        TCP/IP connections on port 5432?
flask-quiz-app-1       |
flask-quiz-app-1       |
flask-quiz-app-1       | The above exception was the direct cause of the following exception:
flask-quiz-app-1       |
flask-quiz-app-1       | Traceback (most recent call last):
flask-quiz-app-1       |   File "/app/app.py", line 12, in <module>
flask-quiz-app-1       |     db.create_all()
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 1094, in create_all
flask-quiz-app-1       |     self._execute_for_all_tables(app, bind, 'create_all')
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 1086, in _execute_for_all_tables
flask-quiz-app-1       |     op(bind=self.get_engine(app, bind), **extra)
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/sql/schema.py", line 4889, in create_all
flask-quiz-app-1       |     bind._run_ddl_visitor(
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 3146, in _run_ddl_visitor
flask-quiz-app-1       |     with self.begin() as conn:
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 3062, in begin
flask-quiz-app-1       |     conn = self.connect(close_with_result=close_with_result)
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 3234, in connect
flask-quiz-app-1       |     return self._connection_cls(self, close_with_result=close_with_result)
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 96, in __init__
flask-quiz-app-1       |     else engine.raw_connection()
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 3313, in raw_connection
flask-quiz-app-1       |     return self._wrap_pool_connect(self.pool.connect, _connection)
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 3283, in _wrap_pool_connect
flask-quiz-app-1       |     Connection._handle_dbapi_exception_noconnection(
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 2117, in _handle_dbapi_exception_noconnection
flask-quiz-app-1       |     util.raise_(
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 207, in raise_
flask-quiz-app-1       |     raise exception
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 3280, in _wrap_pool_connect
flask-quiz-app-1       |     return fn()
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 310, in connect
flask-quiz-app-1       |     return _ConnectionFairy._checkout(self)
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 868, in _checkout
flask-quiz-app-1       |     fairy = _ConnectionRecord.checkout(pool)
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 476, in checkout
flask-quiz-app-1       |     rec = pool._do_get()
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/pool/impl.py", line 145, in _do_get
flask-quiz-app-1       |     with util.safe_reraise():
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__
flask-quiz-app-1       |     compat.raise_(
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 207, in raise_
flask-quiz-app-1       |     raise exception
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/pool/impl.py", line 143, in _do_get
flask-quiz-app-1       |     return self._create_connection()
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 256, in _create_connection
flask-quiz-app-1       |     return _ConnectionRecord(self)
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 371, in __init__
flask-quiz-app-1       |     self.__connect()
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 665, in __connect
flask-quiz-app-1       |     with util.safe_reraise():
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__
flask-quiz-app-1       |     compat.raise_(
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 207, in raise_
flask-quiz-app-1       |     raise exception
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 661, in __connect
flask-quiz-app-1       |     self.dbapi_connection = connection = pool._invoke_creator(self)
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/create.py", line 590, in connect
flask-quiz-app-1       |     return dialect.connect(*cargs, **cparams)
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 597, in connect
flask-quiz-app-1       |     return self.dbapi.connect(*cargs, **cparams)
flask-quiz-app-1       |   File "/usr/local/lib/python3.10/site-packages/psycopg2/__init__.py", line 122, in connect
flask-quiz-app-1       |     conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
flask-quiz-app-1       | sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not connect to server: Connection refused
flask-quiz-app-1       |        Is the server running on host "postgres" (172.20.0.2) and accepting
flask-quiz-app-1       |        TCP/IP connections on port 5432?
flask-quiz-app-1       |

There are my non docker files: models.py:

from datetime import datetime

import flask_sqlalchemy

db = flask_sqlalchemy.SQLAlchemy()


class Quiz(db.Model):
    __tablename__ = 'quiz'
    id = db.Column(db.Integer, primary_key=True)
    question = db.Column(db.String(255))
    answer = db.Column(db.String(100))
    created = db.Column(db.DateTime, default=datetime.utcnow)

    def __repr__(self):
        return f"id: {self.id}, answer: {self.answer}, created: {self.created}"

config.py

user = "tzuser"
password = "password"
host = "postgres"
database = "tzdb"
port = "5432"

DATABASE_CONNECTION_URI = f'postgresql+psycopg2://{user}:{password}@{host}:{port}/{database}'

app.py

import json
from flask import Flask, request

from models import db
import config

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = config.DATABASE_CONNECTION_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.app_context().push()
db.init_app(app)
db.create_all()


# @app.route('/', methods=['GET'])
@app.route('/')
def hello_world():
    return 'Flask Dockerized!'

There are my Dockerfile

FROM python:3.10

WORKDIR /app
COPY . .

RUN pip install -r requirements.txt

ENTRYPOINT ["python"]
CMD ["app.py"]

and docker-compose.yml

version: '3.9'
services:
  app:
    build:
      context: ./app
    ports:
      - 5000:5000
    volumes:
      - ./app:/app
  postgres:
    image: postgres:13.3
    healthcheck:
      test: [ "CMD", "pg_isready", "-q", "-d", "postgres", "-U", "tzuser" ]
      timeout: 45s
      interval: 10s
      retries: 10
    restart: always
    environment:
      POSTGRES_DB: tzdb
      POSTGRES_USER: tzuser
      POSTGRES_PASSWORD: password
    ports:
      - 5432:5432
    volumes:
      # - ./db.sql:/docker-entrypoint-initdb.d/db.sql
      # - ./postgres-data:/var/lib/postgresql/data
      - ./db-data/:/var/lib/postgresql/data/
        # - ./init.sql:/docker-entrypoint-initdb.d/init.sql


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source