2015-08-23 2 views
21

Как управлять хостом из контейнера-докера?Как запустить сценарий оболочки на хосте из контейнера докеров?

Например, как выполнить скопированный сценарий хоста bash?

+6

бы не то, что быть точно напротив того, чтобы изолировать от хозяина докер? –

+1

Да. Но иногда это необходимо. –

+0

Возможный дубликат [Выполнять команды хоста из контейнера докеров] (http://stackoverflow.com/questions/31720935/execute-host-commands-from-within-a-docker-container) –

ответ

8

Это ДЕЙСТВИТЕЛЬНО зависит от того, что вам нужно для создания сценария bash!

Например, если сценарий Баш просто повторяет некоторые результаты, вы можете просто сделать

docker run --rm -v $(pwd)/mybashscript.sh:/mybashscript.sh ubuntu bash /mybashscript.sh 

Другая возможность заключается в том, что вы хотите, чтобы скрипт Баш установить некоторые Software- сказать скрипт для установки Докер-Compose. вы могли бы сделать что-то вроде

docker run --rm -v /usr/bin:/usr/bin --privileged -v $(pwd)/mybashscript.sh:/mybashscript.sh ubuntu bash /mybashscript.sh 

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

+0

У меня возникла идея создать контейнер, который соединяется с хостом и создает новые контейнеры. –

+0

Docker, похоже, не похож на ваш родственник. Это должно работать 'docker run --rm -v $ (pwd) /mybashscript.sh:/work/mybashscript.sh ubuntu/work/mybashscript.sh' – KCD

+0

Спасибо за уловку, я исправил сообщение! –

2

Как напоминает Маркус, докер является в основном процессом изоляции. Начиная с грузчиком 1.8, вы можете копировать файлы в обоих направлениях между хостом и контейнером, см РОУ docker cp

https://docs.docker.com/reference/commandline/cp/

После того, как файл будет скопирован, вы можете запустить его локально

+0

Я знаю это. Как запустить этот скрипт, другими словами, внутри контейнера докеров? –

+1

дубликат http://stackoverflow.com/questions/31720935/execute-host-commands-from-within-a-docker-container/31721604#31721604? – user2915097

+2

@АлексУшаков: никак. Это может сломать много преимуществ докера. Не делай этого. Не пытайтесь. Пересмотрите, что вам нужно сделать. –

1

Для расширения user2915097'sresponse

Идея изоляции заключается в том, чтобы иметь возможность ограничить то, что приложение/процесс/контейнер (независимо от вашего угла) может сделать с хост-системой очень четко. Следовательно, возможность копирования и выполнения файла действительно нарушит всю концепцию.

Да. Но иногда это необходимо.

Нет. Это не тот случай, или Docker не подходит. То, что вы должны сделать, это объявить четкий интерфейс для того, что вы хотите сделать (например, обновить конфигурацию хоста) и написать минимальный клиент/сервер, чтобы сделать точно, что и ничего более. Однако, как правило, это не очень желательно. Во многих случаях вам следует просто пересмотреть свой подход и искоренить эту потребность. Докер пришел в существование, когда в основном все было услугой, доступной по протоколу. Я не могу придумать какой-либо надлежащий порядок использования контейнера Docker, получающего права на выполнение произвольных действий на хосте.

+0

Я сделал это дело клиента/сервера :) https://github.com/indiehosters/d-sole –

+0

У меня есть прецедент: у меня есть докционированная служба 'A' ​​(src on github). В 'A' repo я создаю правильные крючки, которые после команды« git pull »создают новое изображение докеров и запускают их (и, конечно, удаляют старый контейнер). Далее: github имеет веб-крючки, которые позволяют создавать запрос POST для произвольной ссылки конечной точки после нажатия на главный. Поэтому я не создам докционированный сервис B, который будет этой конечной точкой и который будет запускать только «git pull» в репо A на машине HOST (важно: команда «git pull» должна быть выполнена в среде HOST, а не в среде B, потому что B не может запустить новый контейнер A внутри B ...) –

+1

Проблема: я хочу ничего не делать в HOST, кроме linux, git и docker. И я хочу иметь dockerizet сервис A и сервис B (который фактически является git-push-обработчиком, который выполняет git pull on repo A после того, как кто-то сделает git push на master). Так что git auto-deploy - это проблемный случай использования –

12

Я знаю, что это старый вопрос, но, может быть идеальным решением является подключение к хосту через SSH и выполнить команду:

ssh -l ${USERNAME} ${HOSTNAME} "${SCRIPT}" 
+0

В качестве другого обходного пути контейнер может выводить набор команд, и хост может запускать их после завершения контейнера: eval $ (запуск docker -rm -it container_name_to_output) – parity3

+0

Мне нужно запустить командную строку на хосте изнутри Докер-контейнер, но когда я захожу в контейнер, 'ssh' не найден. Есть ли у вас другие предложения? –

+0

@RonRosenfeld, в котором изображение Docker вы используете? в случае debian/ubuntu запустите это: 'apt update && apt install openssh-client'. –

Смежные вопросы