38 lines
1.2 KiB
Python
38 lines
1.2 KiB
Python
import time
|
|
import sys
|
|
import os
|
|
from sqlalchemy import create_engine
|
|
from sqlalchemy.exc import OperationalError
|
|
|
|
def wait_for_db(max_retries=30, retry_delay=2):
|
|
"""Wait for database to be ready"""
|
|
|
|
mysql_host = os.getenv('MYSQL_HOST', 'db')
|
|
mysql_user = os.getenv('MYSQL_USER', 'vendinguser')
|
|
mysql_password = os.getenv('MYSQL_PASSWORD', 'vendingpass')
|
|
mysql_db = os.getenv('MYSQL_DATABASE', 'vending')
|
|
|
|
db_uri = f'mysql+pymysql://{mysql_user}:{mysql_password}@{mysql_host}:3306/{mysql_db}'
|
|
|
|
print(f"⏳ Waiting for MySQL at {mysql_host}:3306...")
|
|
|
|
for attempt in range(1, max_retries + 1):
|
|
try:
|
|
engine = create_engine(db_uri)
|
|
connection = engine.connect()
|
|
connection.close()
|
|
print("✓ MySQL is ready!")
|
|
return True
|
|
except OperationalError as e:
|
|
if attempt < max_retries:
|
|
print(f"Waiting for MySQL... (attempt {attempt}/{max_retries})")
|
|
time.sleep(retry_delay)
|
|
else:
|
|
print(f"❌ Failed to connect to MySQL after {max_retries} attempts")
|
|
print(f"Error: {e}")
|
|
sys.exit(1)
|
|
|
|
return False
|
|
|
|
if __name__ == '__main__':
|
|
wait_for_db() |