n1ro°
RU

Текст и данные · Инструкция

docker exec и docker attach: в чём разница

`docker exec` и `docker attach` работают с уже запущенным контейнером, но делают принципиально разное.

Редакция N1RO · Проверено

Короткий ответ

`docker exec` запускает новый процесс в работающем контейнере; `docker attach` подключает терминал к stdin/stdout основного процесса. Для диагностической shell-сессии обычно нужен exec.

Что важно знать про docker exec

Команды похожи тем, что работают с уже запущенным container, но attach не создаёт shell. Он подключается к потокам primary process, поэтому клавиши и сигналы могут влиять на приложение. Exec удобен для `sh`, `bash`, `ps`, чтения файла или одноразовой диагностики. Новый процесс существует, пока основной процесс контейнера остаётся жив.

Совет: Для диагностики начинайте с exec, а attach оставляйте для работы с главным процессом.

Как выбрать exec или attach

  1. Определите: новый процесс или primary process.
  2. Для shell используйте `docker exec -it NAME sh`.
  3. Для потоков PID 1 используйте `docker attach NAME`.
  4. При attach помните detach keys.
  5. После exec отдельно проверьте exit code.

Предупреждение: Не нажимайте привычный Ctrl+C в attach, если не хотите послать interrupt основному процессу.

Нюансы: container shell и stdin stdout

Attach полезен, когда нужно наблюдать или управлять именно интерактивным PID 1. При TTY важно знать detach sequence, чтобы выйти, не остановив приложение. При расследовании сначала сформулируйте цель: «запустить отдельную команду» почти всегда означает exec; «подключиться к текущей консоли процесса» — attach.

Важно: Убедитесь, что в image вообще есть `sh`/`bash`, прежде чем считать ошибку exec проблемой Docker.

Пример: открыть shell без подключения к PID 1

Сервер работает как PID 1: `docker exec -it web sh` создаст отдельную shell, а `docker attach web` подключится к самому серверу.

Как открыть shell для диагностики

Для работающего контейнера используйте `docker exec -it NAME sh` или доступную shell внутри image. Это создаёт отдельный процесс и не подключает ваш терминал к PID 1. Если shell отсутствует в slim/distroless image, запускайте конкретную diagnostic command или используйте подходящий debug workflow.

Почему attach требует осторожности

Attach передаёт ввод и сигналы основному процессу. Неправильный выход из интерактивной сессии способен завершить процесс и контейнер. Docker поддерживает detach sequence, поэтому перед использованием attach проверьте сочетание клавиш и поведение конкретного процесса.

exec и attach подключаются по-разному

  • docker exec -it NAME sh. запускается новый процесс shell внутри работающего контейнера. диагностика и разовые команды
  • docker attach NAME. терминал подключается к stdin/stdout основного процесса контейнера. наблюдать или взаимодействовать именно с PID 1
  • detach sequence. можно отсоединиться от attach без остановки контейнера при корректной последовательности клавиш. когда нужно оставить основной процесс работающим

Что учитывать

Команды похожи тем, что работают с уже запущенным container, но attach не создаёт shell. Он подключается к потокам primary process, поэтому клавиши и сигналы могут влиять на приложение. Exec удобен для `sh`, `bash`, `ps`, чтения файла или одноразовой диагностики. Новый процесс существует, пока основной процесс контейнера остаётся жив.

Источники и проверка

Фактическая часть сверена по первичным источникам (в т.ч. docker container exec). Пример и формулировки — редакция N1RO на 2026-09-22.