Команда docker exec одна из самых полезных при работе с Docker. Она позволяет запускать команды в уже запущенном контейнере без остановки или перезапуска контейнера. Это особенно важно при отладке, проверке состояния контейнера или изучении файловой системы внутри него.
Что делает docker exec
Команда docker exec запускает указанную программу внутри работающего контейнера. Примеры использования:
Запустить интерактивную оболочку (shell) внутри контейнера
Выполнить одиночную команду и получить её вывод
Передать переменные окружения или работать от имени другого пользователя внутри контейнера
Важно: команда работает только с контейнерами, которые уже запущены. Если контейнер остановлен, потребуется сначала его запустить.
Запуск тестового контейнера
Для демонстрации создадим контейнер на базе минимального образа Alpine Linux:
docker run -d --name container-name alpine watch "date >> /var/log/date.log"Разбор команды:
-d- запускает контейнер в фоновом режиме.--name container-name- задаёт имя контейнера.alpine- образ Linux.watch "date >> /var/log/date.log"- команда, которая каждые 2 секунды дописывает текущую дату в лог-файл внутри контейнера.
Как узнать имя контейнера
Чтобы использовать docker exec, нужно знать имя или ID контейнера. Для этого выполним:
docker psВывод покажет список работающих контейнеров:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
76aded7112d4 alpine "watch 'date >> /var…" 11 seconds ago Up 10 seconds container-nameВы можете использовать либо CONTAINER ID, либо NAMES в команде docker exec.
Интерактивная оболочка внутри контейнера
Чтобы попасть внутрь контейнера и работать как в обычной оболочке:
docker exec -it container-name shЗдесь:
-i- оставляет stdin открытым.-t- выделяет терминал (TTY), чтобы работать интерактивно.
Вы попадёте в простой shell. Чтобы выйти, наберите:
exitЗапуск команды без интерактивного режима
Если нужно выполнить команду и сразу получить вывод, без входа в оболочку:
docker exec container-name tail /var/log/date.logПример вывода:
Tue Jan 27 07:23:38 UTC 2026
Tue Jan 27 07:23:40 UTC 2026
...Такая команда подходит для быстрого получения информации или логов.
Запуск команд в указанной директории
Если нужно выполнить команду из конкретной директории внутри контейнера:
docker exec --workdir /tmp container-name pwdОжидаемый вывод:
/tmpФлаг --workdir изменяет текущую рабочую директорию перед выполнением команды.
Выполнение команды от имени другого пользователя
Чтобы выполнить команду с правами конкретного пользователя, используйте:
docker exec --user guest container-name whoamiОжидаемый вывод:
guestФлаг --user указывает пользователя внутри контейнера.
Передача переменных окружения
Иногда требуется передать переменные окружения вместе с командой:
docker exec -e TEST=sammy container-name envВывод покажет установленные переменные, включая TEST=sammy:
PATH=...
HOSTNAME=...
TEST=sammy
HOME=...Чтобы задать несколько переменных, просто повторите флаг -e. Для передачи из файла используйте --env-file.
Частые ошибки
Вот наиболее распространённые проблемы и как их решить:
Контейнер не найден
Error: No such container: container-nameПроверьте имя с помощью docker ps.
Отказ в доступе
Error response from daemon: Permission deniedЗапустите команду с sudo или убедитесь, что ваш пользователь имеет права Docker.
Контейнер остановлен
Error response from daemon: Container ... is not runningЗапустите контейнер:
docker start container-nameи затем повторите docker exec.
Контейнер приостановлен
Error response from daemon: Container ... is pausedСнимите паузу:
docker unpause container-nameи повторите попытку.
Лучшие практики
Для долгих задач используйте
--detach, чтобы команда выполнялась в фоне.Избегайте тяжёлых операций внутри основных контейнеров. Лучше выделить отдельный контейнер.
Следите за производительностью, например с
docker stats.