Текст и данные · Инструкция
docker exec и docker attach: в чём разница
`docker exec` и `docker attach` работают с уже запущенным контейнером, но делают принципиально разное.
Короткий ответ
`docker exec` запускает новый процесс в работающем контейнере; `docker attach` подключает терминал к stdin/stdout основного процесса. Для диагностической shell-сессии обычно нужен exec.
Что важно знать про docker exec
Команды похожи тем, что работают с уже запущенным container, но attach не создаёт shell. Он подключается к потокам primary process, поэтому клавиши и сигналы могут влиять на приложение. Exec удобен для `sh`, `bash`, `ps`, чтения файла или одноразовой диагностики. Новый процесс существует, пока основной процесс контейнера остаётся жив.
Совет: Для диагностики начинайте с exec, а attach оставляйте для работы с главным процессом.
Как выбрать exec или attach
- Определите: новый процесс или primary process.
- Для shell используйте `docker exec -it NAME sh`.
- Для потоков PID 1 используйте `docker attach NAME`.
- При attach помните detach keys.
- После 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.