Будет ли пользователь, созданный на хостовой системе, доступен внутри контейнера Docker?

«Будет ли пользователь, созданный на хостовой системе, доступен внутри контейнера Docker?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, по умолчанию пользователи хоста и контейнера изолированы. Контейнеры используют собственное пространство имён пользователей (User namespace). Пользователи внутри контейнера определяются его образом (например, через инструкции USER и RUN useradd в Dockerfile).

Как можно сопоставить пользователей:

  1. Запуск контейнера с конкретным UID/GID: Самый частый и безопасный способ. Контейнер запускается от указанного идентификатора, но имя пользователя в /etc/passwd контейнера может не существовать.

    docker run -u $(id -u):$(id -g) -v /host/path:/container/path my-image

    Это полезно для правильного управления правами на смонтированных томах.

  2. Монтирование файлов /etc/passwd и /etc/group (не рекомендуется для продакшена): Позволяет контейнеру "видеть" пользователей хоста.

    docker run -v /etc/passwd:/etc/passwd:ro -v /etc/group:/etc/group:ro my-image

    ⚠️ Риск безопасности: Может раскрыть информацию о системе и привести к конфликтам UID.

  3. Создание пользователей в Dockerfile: Правильный подход — определять необходимых пользователей на этапе сборки образа.

    FROM alpine
    RUN addgroup -g 1001 appgroup && adduser -u 1001 -G appgroup -D appuser
    USER appuser

Лучшая практика: Используйте инструкцию USER в Dockerfile для запуска процессов от непривилегированного пользователя, созданного внутри образа.