Администрирование FreeBSD, Linux, ... Docker: команда exec Wed, November 13 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Docker: команда exec Печать
Добавил(а) microsin   

Команда docker exec (docker container exec) выполнит команду в запущенном контейнере.

Синтаксис:

docker container exec [OPTIONS] CONTAINER COMMAND [ARG...]

Псевдоним:

docker exec

Чтобы легко получить консоль отладки (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, и они недоступны для других процессов, работающих внутри контейнера.

$ docker exec -e VAR_A=1 -e VAR_B=2 mycontainer env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=f64a4851eb71
VAR_A=1
VAR_B=2
HOME=/root

Эскалация привилегий контейнера (--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.
5docker: справка по командам.

 

Добавить комментарий


Защитный код
Обновить

Top of Page