Проект включает в себя следующие компоненты:
- app/: Исходный код приложения на FastAPI.
- migrations/: Скрипты миграций базы данных, управляемые с помощью Alembic.
- .env: Файл для настройки переменных окружения (например, параметры подключения к базе данных).
- Dockerfile: Инструкции для сборки Docker-образа приложения.
- docker-compose.yml: Конфигурация для работы с несколькими сервисами в Docker (FastAPI и PostgreSQL).
- requirements.txt: Список Python-зависимостей для проекта
- Базовый образ:
FROM python:3.11-alpine
Рабочая директория:
Мы используем легковесный образ python:3.11-alpine, который содержит минимальный набор библиотек для работы с Python.
WORKDIR /app
Устанавливаем рабочую директорию внутри контейнера /app, в которую будут копироваться все файлы приложения.
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
Установка зависимостей: Копируем файл requirements.txt и устанавливаем все зависимости проекта с помощью pip. Для уменьшения размера образа используется флаг --no-cache-dir, чтобы не сохранялись кэши пакетов.
COPY ./app ./app
COPY .env .env
COPY ./migrations ./migrations
Копирование кода приложения: Копируем исходный код приложения, файлы миграций и конфигурации окружения (.env) в контейнер.
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
Создание непривилегированного пользователя: Создаем нового пользователя appuser и запускаем приложение от его имени. Это помогает повысить безопасность контейнера.
Запуск приложения: Приложение запускается с помощью uvicorn, который запускает сервер FastAPI.
Конфигурация для веб-приложения (web):
Порты: Приложение будет доступно на порту 8000 как внутри контейнера, так и на хост-машине. Переменные окружения: Подключение к базе данных осуществляется с помощью переменных окружения, заданных в .env файле. Зависимость от базы данных: Контейнер с приложением зависит от контейнера с базой данных, и будет запускаться только после того, как база данных будет готова. Тома: Для хранения статических файлов проекта используется том static_data.
Конфигурация для базы данных (db):
Контейнер с базой данных использует официальный образ PostgreSQL, а данные хранятся в томе db_data, что обеспечивает сохранность данных между перезапусками контейнера.
Сетевые настройки:
Все контейнеры работают в одной сети internal, что позволяет безопасно обмениваться данными внутри контейнеров.
Тома: Для сохранения данных между перезапусками контейнеров создаются два тома:
- db_data — для данных базы данных PostgreSQL.
- static_data — для хранения статических файлов приложения.
Container memory usage 89.56MB