Ответ
Официальный образ postgres на Docker Hub сконфигурирован для запуска от непривилегированного пользователя postgres с UID 999 внутри контейнера.
Практические детали и проблемы:
-
Запуск и проверка:
docker run -d --name test-postgres -e POSTGRES_PASSWORD=secret postgres:15 docker exec test-postgres whoami # postgres docker exec test-postgres id # uid=999(postgres) gid=999(postgres) groups=999(postgres),101(ssl-cert) -
Проблема с volume и правами: Частая ошибка – монтирование host-директории, владельцем которой является ваш локальный пользователь (UID 1000). Postgres (UID 999) не сможет писать в нее. Решения:
- Использовать named volume (Docker управляет правами):
docker volume create pgdata docker run -v pgdata:/var/lib/postgresql/data postgres:15 - Изменить UID при запуске (менее безопасно, может сломать работу):
docker run -u 1000:1000 -v /host/path:/var/lib/postgresql/data postgres:15 - Инициализировать volume заранее или использовать entrypoint-скрипт для смены прав.
- Использовать named volume (Docker управляет правами):
-
Безопасность: Запуск от не-root пользователя
postgres– это security best practice, ограничивающая ущерб в случае компрометации контейнера. Сам демон Postgres внутри контейнера также запускается от этого пользователя.