> Как происходит работа с дескрипторами процессов внутри контейнеров и есть ли доступ к дескрипторам хостовой машины (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: YADRO

Стек: Go

> Пример ответа

В контейнерах, работающих на Go, дескрипторы процессов (файловые дескрипторы, сокеты, пайпы) изолированы через пространства имён (namespaces). Каждый контейнер имеет собственное пространство PID, что означает, что процесс с PID 1 внутри контейнера - это не процесс хоста, а изолированный init-процесс. Доступа к дескрипторам хостовой машины по умолчанию нет: контейнер видит только свои файловые дескрипторы, открытые в его пространстве имён.

Однако возможны исключения:

  • Если контейнер запущен с привилегиями (--privileged), он может получить доступ к /proc хоста и, следовательно, к дескрипторам других процессов.
  • При монтировании хостовой файловой системы (например, -v /proc:/host/proc) контейнер может читать дескрипторы хоста через /host/proc/<pid>/fd.
  • Использование SYS_PTRACE capability позволяет трейсить процессы хоста.

В Go для работы с дескрипторами внутри контейнера обычно используют стандартные пакеты (os, syscall), которые работают в рамках изоляции. Например, чтобы получить список открытых дескрипторов текущего процесса:

GO
import "os"
fds, _ := os.ReadDir("/proc/self/fd")

Это покажет только дескрипторы внутри контейнера. Для доступа к хосту потребуется явное монтирование и привилегии, что нарушает модель безопасности контейнеров.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью