Чтобы легко получить консоль отладки (debug shell) в любой контейнер, используйте команду docker debug [1]. Эта фича заменяет отладку через docker exec, с ней вы можете получить шелл в любой контейнер или образ, даже в slim, без модификаций. Кроме того, вы можете взять с собой ваши любимые утилиты отладки в настраиваемом наборе инструментов.
[Описание команды docker exec]
Команда docker exec запустит новую программу (команду гостевой операционной системы) в работающем контейнере. Для Linux/Ubuntu это обычно команда /bin/bash, которая позволяет запустить окно терминала в работающем контейнере. Команда, указанная с помощью docker exec, выполняется только во время выполнения основного процесса контейнера (PID 1) и не перезапускается при перезапуске контейнера. Команда запустится в директории по умолчанию контейнера.
Команда должна быть исполняемая. Цепная или заключенная в кавычки команда не работает. Например, следующая команда сработает (будут выведены строчки a и b):
$ docker exec -it my_container sh -c "echo a && echo b"
a
b
Эта команда не сработает:
$ docker exec -it my_container "echo a && echo b"
[Опции команды docker exec]
Опция
Описание
-d, --detach
Отсоединенный режим: команда запустится в фоновом режиме.
--detach-keys
Переназначает последовательность клавиш для отсоединения контейнера.
-e, --env
API 1.25+, установка переменных окружения.
--env-file
API 1.25+, чтение в файле переменных окружения.
-i, --interactive
Сохранять открытым STDIN, даже если он не присоединен.
--privileged
Дать команде расширенные привилегии.
-t, --tty
Выделить pseudo-TTY.
-u, --user
Username или UID (format: < name|uid>[:< group|gid>]).
-w, --workdir
API 1.35+, рабочая директория внутри контейнера.
[Примеры docker exec]
Запуск docker exec на работающем контейнере. Сначала запустите контейнер:
$ docker run --name mycontainer -d -i -t alpine /bin/sh
Эта команда создаст и запустит контейнер с именем mycontainer из образа alpine, где в качестве основного процесса будет шелл sh. Опция -d (сокращение опции --detach) установит контейнер в режиме фонового запуска, или отключенном режиме (background, detached mode), с подсоединенным pseudo-TTY (-t). Опция -i сохранит присоединенным STDIN, что не даст процессу sh немедленно завершиться.
Далее запустите команду на контейнере:
$ docker exec -d mycontainer touch /tmp/execWorks
Эта команда создаст новый файл /tmp/execWorks внутри работающего контейнера mycontainer, в фоновом режиме.
Далее запустите интерактивный шелл sh на контейнере:
$ docker exec -it mycontainer sh
Эта команда запустит новую сессию шелла в контейнере mycontainer.
Установка переменных окружения для exec process (--env, -e). Далее установим переменные окружения в текущей сессии bash.
Команда docker exec наследует переменные окружения, которые были установлены в момент создания контейнера. Используйте опцию --env (или её сокращенную версию -e), чтобы переназначить глобальные переменные окружения, или чтобы установить дополнительные переменные окружения для процесса, запущенного docker exec.
Следующий пример создаст новую сессию шелла в контейнере mycontainer, с переменной окружения $VAR_A, установленной в 1, и $VAR_B установленной в 2. Эти переменные окружения останутся достоверными только для процесса sh, запущенного командой docker exec, и они недоступны для других процессов, работающих внутри контейнера.
Эскалация привилегий контейнера (--privileged). Флаг --privileged дает контейнеру следующие возможности:
• Разрешает все фичи ядра Linux. • Запрещает профиль seccomp по умолчанию. • Запрещает профиль AppArmor. • Запрещает метку процесса SELinux. • Предоставляет доступ ко всем устройствам хоста. • Делает /sys доступным для чтения и записи. • Делает монтирования cgroups доступными для чтения и записи.
Другими словами, контейнер тогда может делать почти все, что может делать хост. Этот флаг существует, чтобы позволить специальные случаи использования, наподобие запуска Docker внутри Docker.
Предупреждение: используйте --privileged с осторожностью. Контейнер с --privileged не является надежно изолированным процессом (не работает в "песочнице" sandboxed). Контейнеры в этом режиме могут получить root шелла на хосте, и взять управление над системой.
Для большинства случаев этот флаг не должен быть предпочтительным решением. Если ваш контейнер требует эскалированных привилегий, то вы предпочтительнее должны явно предоставить необходимые разрешения, например добавить индивидуальные фичи ядра с помощью --cap-add. Для дополнительной информации по см. описание runtime-привилегий и возможностей Linux [3].
Следующий пример не сработает, потому что по умолчанию Docker отбрасывает большинство потенциально опасных фич ядра (dangerous kernel capabilities), включая CAP_SYS_ADMIN (которая требуется для монтирования файловых систем):
$ docker run -t -i --rm ubuntu bash
root@bc338942ef20:/# mount -t tmpfs none /mnt
mount: permission denied
Эта команда сработает, когда вы добавите флаг --privileged:
$ docker run -t -i --privileged ubuntu bash
root@50e3f57e16e6:/# mount -t tmpfs none /mnt
root@50e3f57e16e6:/# df -h
Filesystem Size Used Avail Use% Mounted on
none 1.9G 0 1.9G 0% /mnt
Установка рабочей директории для exec процесса (--workdir, -w). По умолчанию команда docker exec запускается в той же рабочей директории, которая была установлена при создании контейнера.
$ docker exec -it mycontainer pwd
/
Вы можете указать альтернативную рабочую директорию для выполняемой команды, используя опцию --workdir (или её сокращенную версию -w):
$ docker exec -it -w /root mycontainer pwd
/root
Попытка запустить docker exec контейнера, находящегося на паузе. Если контейнер в состоянии паузы (paused), то команда docker exec не выполнится, и выдаст ошибку:
$ docker pause mycontainer
mycontainer
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
482efdf39fac alpine "/bin/sh" 17 seconds ago Up 16 seconds (Paused) mycontainer
$ docker exec mycontainer sh
Error response from daemon: Container mycontainer is paused, unpause the container before exec
$ echo $?
1
[Ссылки]
1. docker container exec site:docs.docker.com. 2. docker debug site:docs.docker.com. 3. Runtime privilege and Linux capabilities site:docs.docker.com. 4. tmpfs mounts site:docs.docker.com. 5. docker: справка по командам.