Как дебажить контейнер с --pid=host и nsenter

Практические лайфхаки для разработчиков, DevOps и админов: Docker, Linux, Bash, Python, Golang, Ansible, логи и безопасность — только рабочие решения. Даем готовые команды, конфиги и приёмы диагностики, которые экономят часы и дни. Если нужно быстро настроить, отладить и обезопасить инфраструктуру — вы по адресу.

dockernsenterpid

👁 Иногда приложение в контейнере отказывается запускаться или умирает сразу после старта, и обычный docker exec не помогает — просто не успеваешь подключиться. Или контейнер вообще не доходит до точки, где ты мог бы зайти внутрь. В таких случаях пригодится нестандартный способ — зайти в контейнер через пространства имён ядра с помощью nsenter.

📝 Что делаем:

  • Запускаем контейнер с доступом к PID пространства хоста:

    docker run -d --pid=host --name myapp myimage
  • Находим PID нужного процесса (или контейнера через docker inspect).

  • Используем nsenter, чтобы «нырнуть» в его окружение:

    PID=$(docker inspect --format '{{.State.Pid}}' myapp)
    nsenter -t $PID -m -u -i -n -p bash

    Теперь ты буквально внутри контейнера, даже если тот висит, умирает или работает в обрезанном окружении. Можно смотреть файловую систему, процессы, конфиги — всё, что иначе было бы недоступно.

🔎 Это особенно полезно:

  • При отладке init-контейнеров и sidecar-процессов
  • Если ты используешь alpine-образы без bash, ps, top
  • Когда стандартные инструменты логирования не успевают собрать инфу
  • При изучении namespaces и безопасности контейнеров

❗️ Комбо --pid=host + nsenter — мощный инструмент для дебага, и он часто оказывается последним шансом, когда всё остальное уже не работает.

tags: #docker #troubleshooting #полезно

❤️ @recura_tech

Тёмное заглавное изображение с текстом «Как дебажить контейнер с --pid=host и nsenter», логотипом RECURA и хэштегом #docker
Обложка поста: название приёма и бренд RECURA

Читайте так же