← Назад к вопросам

Какой юзер будет при запуске Postgres контейнера?

2.0 Middle🔥 223 комментариев
#Docker и контейнеризация

Комментарии (3)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Пользователь при запуске Postgres контейнера

При запуске официального образа Postgres (Docker Hub) процесс внутри контейнера выполняется от имени пользователя postgres (UID 999). Это ключевая особенность, реализованная для соблюдения лучших практик безопасности.

Почему именно postgres?

Docker-образ Postgres сознательно не использует root (UID 0) по соображениям безопасности:

  • Минимизация прав — процесс работает с минимальными необходимыми привилегиями.
  • Изоляция от хоста — снижает риски при возможном escape из контейнера.
  • Соответствие принципу наименьших привилегий — стандарт для production-сред.

Как это реализовано

Официальный образ использует директиву USER в Dockerfile:

# Фрагмент из официального Dockerfile
RUN groupadd -r postgres --gid=999 && useradd -r -g postgres --uid=999 postgres
USER postgres

А также gosu для корректной обработки сигналов и работы entrypoint-скриптов.

Практические аспекты

1. Работа с volumes

При монтировании volumes на хост-системе могут возникать проблемы с правами, так как UID 999 внутри контейнера обычно не существует на хосте.

Проблема:

# На хосте владельцем будет root или другой пользователь
$ ls -la /var/lib/postgresql/data
drwxr-xr-x 2 root root 4096 ...

# Внутри контейнера postgres не может писать
docker logs postgres-container
# FATAL:  data directory "/var/lib/postgresql/data" has wrong ownership

Решение:

  • Использовать named volumes (Docker управляет правами автоматически)
  • Или настроить соответствие UID на хосте:
# Создать на хосте пользователя с UID 999
sudo groupadd -g 999 postgres
sudo useradd -u 999 -g 999 postgres

# Или изменить владельца директории
sudo chown -R 999:999 /path/to/postgres-data

2. Запуск с другим пользователем

При необходимости можно переопределить пользователя:

# Запуск от root (НЕ рекомендуется для production)
docker run -d --name postgres-test \
  --user root \
  -e POSTGRES_PASSWORD=secret \
  postgres:15

# Запуск с другим UID
docker run -d --name postgres-custom \
  --user 1000:1000 \
  -e POSTGRES_PASSWORD=secret \
  postgres:15

3. Проверка текущего пользователя

# Внутри запущенного контейнера
docker exec -it postgres-container bash
whoami  # postgres
id       # uid=999(postgres) gid=999(postgres) groups=999(postgres)

Безопасность в Kubernetes

В Kubernetes для Postgres StatefulSet рекомендуется использовать securityContext:

apiVersion: apps/v1
kind: StatefulSet
spec:
  template:
    spec:
      securityContext:
        runAsUser: 999
        runAsGroup: 999
        fsGroup: 999
      containers:
      - name: postgres
        image: postgres:15

Ключевые выводы

  1. Стандартный пользовательpostgres (UID 999, GID 999)
  2. Безопасность — отказ от root снижает surface attack
  3. Права доступа — требуют внимания при работе с hostPath volumes
  4. Гибкость — можно переопределить через флаг --user или securityContext
  5. Production best practice — всегда используйте официальные образы и не меняйте пользователя без необходимости

Пример полного запуска с правильными настройками

# Создание volume для данных
docker volume create postgres-data

# Запуск контейнера
docker run -d \
  --name postgres-production \
  -e POSTGRES_PASSWORD=StrongPass123! \
  -e POSTGRES_DB=appdb \
  -e POSTGRES_USER=appuser \
  -v postgres-data:/var/lib/postgresql/data \
  -p 5432:5432 \
  --restart unless-stopped \
  postgres:15-alpine

# Проверка
docker exec postgres-production psql -U appuser -d appdb -c "SELECT version();"

Использование пользователя postgres — сознательное архитектурное решение, которое делает контейнеры Postgres более безопасными и предсказуемыми в production-средах.

Какой юзер будет при запуске Postgres контейнера? | PrepBro