7.6 Docker Compose на примере FastAPI, PostgreSQL
0 из 6 шагов пройдено
0 из 14 баллов  получено

PostgreSQL

Для создания базы данных мы обновим файл docker-compose.yml добавив блок под названием db. В этом блоке мы пропишем учетные данные пользователя и имя базы, и том, на котором будем хранить базу. Обратите внимание на версию образа postgres, возможно вы захотите её изменить.

services:
  web:
    # Берем Dockerfile из каталога app
    build: app
    # Запускаем тестовый сервер
    command: uvicorn app.main:app --host 0.0.0.0
    # куда будут помещены данные из каталога app
    volumes:
      - .:/app
    # Открываем порт 8000 внутри и снаружи
    ports:
      - 8000:8000
    depends_on:
      - db

  db:
    image: postgres:15
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      POSTGRES_USER: "postgres_user"
      POSTGRES_PASSWORD: "postgres_password"
      POSTGRES_DB: "postgres_database"

volumes:
  postgres_data:


Обычно в контейнерах базы данных не запускают (исключения локальная разработка и тесты). Если вам нужно запускать базу в контейнере, то скорее всего вы будете делать это не единожды. В обычном случае, если не описывать volume для контейнера с базой, каждое пересоздание контейнера приведет к уничтожению базы и данных. В случае выше мы описали создание внешнего docker-тома postgres_data, который будет хранить данные на случай пересоздания контейнера.

Изменим настройки подключения к БД в FastAPI, для этого в файле app/backend/db.py внесем имзенения:

from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession
from sqlalchemy.orm import DeclarativeBase

engine = create_async_engine('postgresql+asyncpg://postgres_user:postgres_password@db:5432/postgres_database',
                             echo=False)

async_session_maker = async_sessionmaker(engine, expire_on_commit=False, class_=AsyncSession)


class Base(DeclarativeBase):
    pass

Также нам нужно изменить настройки подключения для Alembic, изменим строчку подключения в alembic.ini

sqlalchemy.url = postgresql+asyncpg://postgres_user:postgres_password@db:5432/postgres_database

Теперь удалим предыдущий контейнер:

docker-compose down -v

Выполним билд и запуск наших контейнеров еще раз:

docker-compose up -d --build

Откроем Docker Desktop и посмотрим на контейнеры:

Как мы видим они работают, перейдем к миграциям, и запустим их:

docker-compose exec web alembic upgrade head

Убедимся, что были созданы таблицы нашего проекта FastAPI:

docker-compose exec db psql --username=postgres_user --dbname=postgres_database

\l

Также мы можем выполнить команду \c postgres_database и \dt после, чтобы посмотреть таблицы в БД.

На данном этапе мы можем проверить работу с базой данных, добавляя данные, но далее она у нас очиститься, так как мы еще не раз будем пересоздавать наш контейнер. Поэтому пока мы не будем ничего в неё добавлять.

Перейдем по адресу http://127.0.0.1:8000/docs/ и проверим работает ли наш проект:

Попробуем получить все категории:

Как мы видим, наш проект прекрасно работает(выводя пустой список, а не ошибку подключения), в следующем разделе мы начнем подготовку проекта к деплою, добавив сервер приложений Gunicorn и веб-сервер NGINX.


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Нет обсуждений. Начните первое.