Docker Exec: Ваш командный переход для выполнения команд в Docker


Вы когда-нибудь нуждались в том, чтобы увидеть, что происходит внутри контейнера Docker? Контейнеры предназначены быть идемпотентными: если возникла проблема, перезапустите новый контейнер. Но часто жизнь не так проста. Вам нужно выполнить команды в контейнере, чтобы выявить проблему. Именно здесь может помочь команда docker exec.

В этой статье вы узнаете, как выполнять команды в работающем контейнере Docker с использованием команды docker exec.

### Предварительные требования

Чтобы следовать примерам в этой статье, вам потребуется соблюсти следующие условия:

  • – Любая последняя версия Docker Desktop подходит для Windows, Linux или macOS. В данном руководстве используется версия v3.1.0, работающая на Windows 10.

### Запуск контейнера NGINX

Docker exec выполняет команды в контейнерах. Но для этого сначала у вас должен быть контейнер, в котором будут выполняться эти команды. Давайте начнем с загрузки образа Docker и создания демонстрационного контейнера.

  1. 1. Создайте новый каталог, в данном руководстве используется C:\gitrepos\test, чтобы хранить файлы, используемые для контейнера.

2. Создайте файл с именем dockerfile (без расширения), содержащий следующий код. Dockerfile определяет шаги, необходимые для создания контейнера.

FROM nginx:alpine
 COPY index.html /usr/share/nginx/html/index.html

3. Затем создайте файл в том же каталоге с именем index.html, который содержит следующий код. Это файл HTML, который при запуске контейнера будет отображать сообщение “Hello, World”.

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <meta http-equiv="X-UA-Compatible" content="ie=edge"> 
    <title>Hello World - Nginx Docker</title> 
    <style> 
       h1{ font-weight:lighter; font-family: Arial, Helvetica, sans-serif; 
       } 
    </style> 
    </head> 
    <body> 
       <h1> 
          Hello World 
       </h1> 

    </body> 
    </html>

4. Теперь создайте контейнер Docker с Nginx. Поскольку Dockerfile находится в текущем рабочем каталоге, укажите ., чтобы Docker знал, где искать. Также убедитесь, что вы помечаете контейнер с использованием t параметра, чтобы обеспечить более удобную ссылку в будущем.

docker build -t my-nginx .
Creating a Docker container with the build command.

5. Теперь, когда контейнер построен, запустите его с помощью команды docker run.

# rm - информирует Docker удалить контейнер после его остановки 
# d - возвращает управление командной строкой после выполнения команды 
# p - отображает внутренний порт контейнера 80 на внешний порт 80 docker run --rm -d -p 80:80 my-nginx
Start the container with the Docker run command.

6. Наконец, откройте веб-браузер и перейдите по адресу http://localhost/, чтобы увидеть следующее.

Output of the running NGINX container.

Выполнение команд с помощью Docker Exec

При выполнении команд в контейнере Docker может потребоваться выполнение команды интерактивно. Интерактивное выполнение команд означает ввод команды, получение обратной связи, ввод следующей команды и так далее. Интерактивные команды захватывают вашу сессию и мешают вам выполнять другие действия.

Но что если вы уже знаете команды, которые нужно отправить в контейнер заранее, и хотите выполнять команды в фоновом режиме? В таком случае вы можете выполнить неинтерактивные команды. Неинтерактивные команды позволяют отправить команду в Docker и мгновенно вернуть управление консолью.

Нахождение имени и ID контейнера

Теперь, когда у вас есть созданный контейнер, вы можете выполнять команды внутри контейнера. Прежде чем выполнить команду, определите имя или ID контейнера NGINX. Для Docker-команд подойдет как имя, так и ID. С учетом этого запоминание ID может быть сложнее, чем имени!

Чтобы отобразить информацию о любом запущенном контейнере, выполните команду Docker ps, чтобы получить следующую информацию.

docker ps
Displaying running Docker containers.

Скопируйте уникальный идентификатор e17e4b6be01a или случайно сгенерированное имя mystifying_chandrasekhar в буфер обмена для последующего использования.

Выполнение неинтерактивной команды с помощью Docker Exec

В качестве примера выполнения неинтерактивной команды скопируйте и выполните следующую команду для вывода списка файлов в каталоге /var/log с использованием команды ls -l. Передайте все после имени контейнера, mystifying_chandrasekhar, в команду Docker exec.

docker exec mystifying_chandrasekhar ls -l /var/log
Executing a directory listing within the NGINX container.

Избегание вывода в консоль с помощью команд Docker

Мгновенный возврат управления оболочке пользователю позволяет избежать блокировки консоли при выполнении крупных операций. Откажитесь от вывода в консоль с помощью отсоединенной опции d. Приведенная ниже команда создает файл /tmp/execWorks с использованием команды touch внутри контейнера и не отображает никакого вывода в консоли.

docker exec -d mystifying_chandrasekhar touch /tmp/execWorks

Выполнение интерактивных команд с помощью Docker Exec

До этого момента вы узнали, как выполнять неинтерактивные команды в контейнере Docker с помощью docker exec. Но может возникнуть ситуация, когда вам нужно взаимодействовать с контейнером, например, когда необходимо выполнять команды в контейнере интерактивно. В таком случае вам потребуется выполнение команд в интерактивном режиме.

Для выполнения команд в интерактивном режиме с docker exec необходимы две опции, i и t. Опция i поддерживает открытым STDIN, что позволяет отправлять команды в контейнер, а опция t выделяет псевдо-TTY (PTY), канал связи, для ввода команд.

Скопируйте и вставьте следующую команду, чтобы открыть интерактивный приглашающий к вводу командный интерфейс в работающем контейнере Docker с оболочкой Bourne (sh), как указано изменение приглашения на / #.

docker exec -it mystifying_chandrasekhar sh
Running an interactive Docker shell.

После входа в оболочку выполните следующие команды, чтобы продемонстрировать перечисление файлов внутри контейнера. Наконец, выполните команду exit, чтобы выйти из интерактивной оболочки.

ls -l /var/log
exit
Open an interactive command prompt to the container.

Чтобы открыть интерактивный приглашающий знак в определенном каталоге, передайте путь к опции w, указав Docker’у запустить оболочку в указанном каталоге.

Передача переменных среды в запущенный контейнер

Многие программы используют переменные среды для установки конфигураций при запуске. Например, большинству приложений на Java требуется переменная среды JAVA_HOME, чтобы указать путь к Java.

Вы можете передать переменные среды в сеанс, используя опцию e. Например, возможно, вам нужно передать переменные среды с именем MYVAR в запущенный контейнер. Для этого используйте опцию e и укажите пару ключ/значение MYVAR="<some value>", как показано ниже.

docker exec -it -e MYVAR="hello" mystifying_chandrasekhar sh
echo $MYVAR
Pass environment variables

Передача переменных среды с помощью файла

Если у вас много переменных среды или общая конфигурация, удобнее будет хранить эти переменные в файле. Передайте файл относительным или абсолютным путем к Docker с помощью опции --env-file. Эта техника часто используется для передачи безопасных учетных данных контейнеру. Обязательно не добавляйте учетные данные в систему контроля версий!

Создайте текстовый файл с именем env-vars.txt, содержащий переменные среды для передачи и их значения. Этот файл может иметь любое имя, и ему не нужно расширение файла .txt.

Text file with environmental variables defined.

Передайте переменные среды в Docker с помощью опции env-file. Убедитесь, что переменные доступны с помощью команды echo, как показано на скриншоте ниже.

# Передайте файл env-vars.txt и откройте интерактивную подсказку
docker exec -it --env-file env-vars.txt mystifying_chandrasekhar sh
# Проверьте, доступны ли переменные среды в контейнере Docker
echo $MYVAR
echo $FOO
echo $SOMETHING
Passing a environmental variables file to Docker and verifying the environment variables exist in the container.

Взаимодействие с запущенным контейнером от имени другого пользователя

В производственной среде приложения часто запускаются от имени определенного пользователя, чтобы ограничить их доступ. Если вы запускаете приложения от имени определенного пользователя в производственной среде, вам также следует делать это при тестировании команд.

В этом примере контейнер Docker запускается от имени пользователя nginx. Передайте пользователя в опцию w, чтобы указать Docker’у запустить контейнер от имени учетной записи nginx. Команда whoami, запущенная изнутри контейнера, подтверждает, что пользователь nginx действительно используется.

docker exec -it -u nginx mystifying_chandrasekhar sh
whoami
Running the container as the nginx user.

Следующие шаги

Вы узнали, как выполнять команды в запущенном контейнере с помощью команды docker exec. Используя команду exec для входа и допроса запущенных контейнеров, у вас есть мощный новый инструмент в своем арсенале для устранения неполадок в контейнерах Docker.

Теперь попробуйте пойти еще дальше и использовать систему контроля версий Git для загрузки статического веб-сайта в контейнер, а не копировать один файл. Если Git для вас новый, то статья Руководство начинающего по Visual Studio Code и Git – отличное место для начала.

Source:
https://adamtheautomator.com/docker-exec/