Поиск по сайту:

Как запустить команду в работающем контейнере Docker


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

Запуск команд в контейнерах

Чтобы запустить команду в контейнере, вам понадобится его идентификатор контейнера, если вы не настроили конкретное имя для этого контейнера. Это длинная шестнадцатеричная строка, которую вы можете найти в списке процессов Docker:

docker ps

Затем вы можете использовать команду exec -it для запуска внутри контейнера. Например, просмотр вывода файла журнала:

docker exec -it containerID tail /var/log/nginx/access.log

Вы также можете запускать скрипты внутри контейнеров:

docker exec -it containerID script.sh

Флаги -it предназначены для «интерактивного режима» и телетайпа соответственно и используются почти постоянно. Есть несколько других флагов, которые вы можете использовать:

  • --workdir или -w изменяет текущий каталог перед командой.
  • --detach или -d запускает команду в фоновом режиме.
  • --env или -e устанавливает переменные среды перед запуском.
  • --env-file делает то же самое, но более безопасен для обработки секретов.
  • --privived запускает команду с расширенными разрешениями.
  • --user запускается от имени другого пользователя

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

SSH-вход в контейнер

Вы не ограничены простыми командами, вы можете открыть оболочку, запустив /bin/bash в качестве команды. Вы можете быть ограничены в доступных инструментах — большинство контейнеров имеют довольно простую установку Linux — но это значительно упрощает выполнение многих команд.

docker exec -it containerID /bin/bash

Это просто оболочка, доступная с хоста, которая в большинстве случаев работает хорошо. Но, если вы хотите, вы можете настроить свои контейнеры так, чтобы они были полностью доступны через SSH, например VPS. Вы можете узнать больше об этом в нашем руководстве по запуску службы SSH в контейнере Docker.

Копирование файлов в контейнеры и из них

Запуск команд с помощью exec -it работает, но между хостом и контейнером все еще существует прослойка, препятствующая простому написанию сценариев. Во-первых, в то время как легко отправлять команды в контейнер, сложнее получить вывод из файловой системы.

Хотя вы можете передать STDOUT exec -it другим службам в ОС хоста, вы также можете копировать файлы в файловую систему контейнера и из нее. Например, извлечение файла журнала и вставка его на хост:

docker cp container:/var/log/nginx/example.log example.log

Или вытащить целые каталоги:

docker cp nginx:/etc/nginx/ nginxconfig/

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