После поиска в стеке некоторое время я нашел множество способов проверить, готова ли служба докеризованных баз данных перед подключением. Поэтому я включаю их обоих здесь.
Первый написан на скрипте bash, и я нашел его в здесь
if [ "$DATABASE" = "postgres" ]
then
echo "Waiting for postgres..."
while ! nc -z $SQL_HOST $SQL_PORT; do
sleep 0.1
done
echo "PostgreSQL started"
fi
python manage.py flush --no-input
python manage.py migrate
exec "$@"
Второй написан на Python иЯ нашел это в здесь :
class Command(BaseCommand):
"""Django command that waits for database to be available"""
def handle(self, *args, **options):
"""Handle the command"""
self.stdout.write('Waiting for database...')
db_conn = None
while not db_conn:
try:
connection.ensure_connection()
db_conn = True
except OperationalError:
self.stdout.write('Database unavailable, waiting 1 second...')
time.sleep(1)
self.stdout.write(self.style.SUCCESS('Database available!'))
Я использую эту команду Docker ENTRYPOINT ["/usr/src/app/entrypoint.sh"]
для запуска первой.
Я знаю, как писать модульные тесты длявторой, потому что он в питоне. это может быть что-то вроде этого, например:
from unittest.mock import patch
# Use patch to to simulate db for being available or not
from django.core.management import call_command
from django.test import TestCase
class CommandTests(TestCase):
def test_wait_for_db_ready(self):
"""Test waiting for db when db is available"""
with patch('django.db.utils.ConnectionHandler.__getitem__') as gi:
gi.return_value = True
call_command('wait_for_db')
self.assertEqual(gi.call_count, 1)
Но может ли кто-нибудь помочь мне найти способ написания тестов для первого (скрипт bash)?
Кроме того, кто-нибудь можетНазовите недостатки и преимущества каждого метода, а также, если существуют некоторые другие важные соображения для написания такой функции? Спасибо