Какие команды нужны для развертывания PostgreSQL в контейнере
Что проверяют
Умеете ли вы поднять базу для разработки так, чтобы данные переживали перезапуск, а приложение на .NET к ней подключалось. Следом спрашивают про docker compose, строку подключения и базу в интеграционных тестах.
Как отвечать
Базовый набор команд:
- запуск:
docker run -d --name pg -e POSTGRES_PASSWORD=secret -e POSTGRES_DB=app -p 5432:5432 -v pgdata:/var/lib/postgresql/data postgres:17. Версию фиксируйте тегом:latestоднажды принесёт новый мажор; - проверка:
docker ps,docker logs -f pg, готовность черезdocker exec pg pg_isready -U postgres; - подключение:
docker exec -it pg psql -U postgres -d app; - управление:
docker stop,docker start,docker rm. Данные живут в именованном томеpgdata, пока вы не удалите его черезdocker volume rm.
Детали образа: без POSTGRES_PASSWORD контейнер не стартует. POSTGRES_USER, POSTGRES_DB и скрипты из /docker-entrypoint-initdb.d отрабатывают только при первой инициализации пустого каталога данных. В образах 18-й версии каталог данных переехал, и том монтируют в /var/lib/postgresql.
Для проекта на C# удобнее compose.yaml: сервис db с healthcheck на pg_isready и сервис api с depends_on и condition: service_healthy. Строка подключения Npgsql: Host=db;Port=5432;Database=app;Username=postgres;Password=..., пароль из переменных окружения или user secrets, а не из appsettings.json в репозитории. Схему накатывают миграциями EF Core через dotnet ef database update. В интеграционных тестах тот же образ поднимает Testcontainers для .NET, и каждый прогон получает чистую базу.
Где спотыкаются
Запускают без тома. После docker rm база исчезает вместе с тестовыми данными.
Пишут Host=localhost для приложения, которое само работает в контейнере. Там localhost это контейнер приложения, нужно имя сервиса в сети compose.
Меняют POSTGRES_PASSWORD в конфиге и ждут, что пароль сменится. На существующем томе инициализация не повторяется, пароль меняют через ALTER USER.