Скрипт на Python для запуска команд в контейнере Docker

#python-3.x #docker #docker-compose #nsenter

#python-3.x #docker #docker-compose #nsenter

Вопрос:

В настоящее время я работаю над автоматизацией команд для контейнера Docker с помощью скрипта Python на хост-компьютере. На данный момент этот скрипт на Python создает и запускает docker-compose файл с командами для контейнеров, записанными в docker-compose файл и Dockerfile сам.

Что я хочу сделать, так это заставить скрипт Python выполнять все команды внутри контейнера, поэтому, если у меня есть разные сценарии, которые я хочу запустить, я не меняю контейнер. Я пробовал 2 способа.

Сначала нужно было запустить os.system() команду в скрипте Python, однако это работает только до тех пор, пока не откроется оболочка для контейнера, os.system() команда не выполняет код в самом контейнере Docker.

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

Я довольно новичок в Docker и думаю, что должно быть что-то, что я упускаю из виду для запуска скриптовых команд в контейнере. Одно из возможных решений, с которым я столкнулся, nsenter . Является ли это надежным решением и как оно работает? Или есть гораздо более простой способ? Я также использовал docker-volume для копирования файлов python в контейнер для запуска при сборке, однако я все еще не могу найти решение для автоматизации доступа и запуска этих скриптов Python с хост-компьютера.

Комментарии:

1. Вероятно, лучше думать о контейнерах как обертках вокруг одного процесса. Учитывая ваш административный процесс, вы не стали бы пытаться получить оболочку Bourne в этом скрипте Python и запускать команды; точно так же вам действительно не следует пытаться писать сценарий docker exec , а скорее настроить ваши контейнеры на самодостаточность. Можете ли вы привести очень конкретный пример, включающий пример кода и соответствующий файл Dockerfile и docker-compose.yml , конкретной задачи, которую вам нужно было бы выполнить таким образом?

2. У меня есть приложение на Python, tkinter для графического интерфейса, 2 контейнера, результатом является файл .pcap сетевого трафика для анализа угроз / артефактов. В одном контейнере у меня есть небольшие скрипты Python portscanner.py и т.д., В другом tcpdump . Сеть настроена, и тома для обмена файлами с хостом, однако я использую CMD в dockerfile для запуска сценариев. Я хочу иметь возможность управлять выполнением этих сценариев из tkinter графического интерфейса пользователя без перезапуска контейнера, просто передавая команды для запуска различных сценариев для запуска. Не типичный вариант использования Docker. Это легкое автоматизированное приложение для эмуляции противника.

Ответ №1:

Если скрипты необходимо скопировать в работающий контейнер, вы можете сделать это с помощью docker cp команды. например docker cp myscript.sh mycontiainer:/working/dir .

Как только скрипты окажутся в контейнере, вы можете запустить их с помощью docker exec команды. например docker exec -it mycontainer /working/dir/myscript.sh .

Обратите внимание, это не обычная практика. Обычно нужные вам скрипты будут встроены (не скопированы) в изображения контейнера. Затем, когда вы хотите выполнить скрипт (ы) внутри контейнера, вы должны запустить контейнер с помощью docker run команды. например docker run -it mycontainerimage /working/dir/myscript.sh

Комментарии:

1. Спасибо, настройка похожа на CTF, где есть уязвимый контейнер (с уязвимыми службами) и контейнер «атаки» или вызова, а также интерфейс Python Tkinter, запущенный на хост-компьютере. Я хочу, чтобы пользователь мог запускать сценарии в контейнере вызова без необходимости каждый раз перестраивать контейнер, просто выберите скрипт. Если я использую docker run , могу ли я выбрать другие сценарии? У меня есть общий том с хост-машиной, все мои скрипты находятся в общем docker volume , если все скрипты находятся в контейнере, могу ли я вызывать разные скрипты? Работает ли это таким образом?

2. Да, это будет работать так же. Но вы бы внедрили скрипты во время сборки (с общим томом они могут быть изменены во время выполнения). Поскольку обычно рекомендуется, чтобы контейнеры были неизменяемыми, было бы лучше скопировать их во время выполнения. В любом случае, когда вы хотите запускать разные скрипты, вы бы просто использовали docker run для этого, аналогично тому, как я указал в своем ответе.