Запуск сценариев bash на хосте из контейнера Jenkins [дубликат]

Да, вы должны объявить в «конструкторе», если хотите, чтобы список стал свойством объекта, а не свойством класса.

31
задан Alex Ushakov 23 August 2015 в 06:44
поделиться

6 ответов

Это ДЕЙСТВИТЕЛЬНО зависит от того, что вам нужно, чтобы выполнить скрипт bash!

Например, если скрипт bash просто перекликается с некоторым выходом, вы можете просто сделать

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

Another Возможно, вы хотите, чтобы скрипт bash устанавливал какое-то программное обеспечение - скажем, скрипт для установки docker-compose. вы можете сделать что-то вроде

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

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

10
ответ дан Paul Becotte 4 September 2018 в 07:47
поделиться

Используется именованный канал. На хосте os создайте сценарий для циклического и считывания команд, а затем вы вызовете eval.

Попросите контейнер докеров прочитать этот именованный канал.

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

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

Мое единственное предупреждение - быть осторожным в том, почему вы это делаете. Это абсолютно необходимо сделать, если вы хотите создать метод для самостоятельного обновления с помощью пользовательского ввода или что-то еще, но вы, вероятно, не хотите вызывать команду для получения некоторых данных конфигурации, поскольку надлежащим способом было бы передать это как аргументы / том в докер. Также будьте осторожны в том, что вы уклоняетесь, поэтому просто дайте модели разрешения мысли.

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

1
ответ дан Bradford Medeiros 4 September 2018 в 07:47
поделиться

Чтобы расширить user2915097's response :

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

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

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

-2
ответ дан Community 4 September 2018 в 07:47
поделиться

Напишите простой сервер python сервера, прослушивающий порт (скажем, 8080), привяжите порт -p 8080: 8080 с контейнером, сделайте HTTP-запрос на localhost: 8080, чтобы спросить, на сервере python запущены сценарии оболочки с помощью popen, запустите завиток или код записи, чтобы сделать запрос HTTP curl -d '{"foo": "bar"}' localhost: 8080

#!/usr/bin/python
from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
import subprocess
import json

PORT_NUMBER = 8080

# This class will handles any incoming request from
# the browser 
class myHandler(BaseHTTPRequestHandler):
        def do_POST(self):
                content_len = int(self.headers.getheader('content-length'))
                post_body = self.rfile.read(content_len)
                self.send_response(200)
                self.end_headers()
                data = json.loads(post_body)

                // Use the post data
                cmd = "your shell cmd"
                p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
                p_status = p.wait()
                (output, err) = p.communicate()
                print "Command output : ", output
                print "Command exit status/return code : ", p_status

                self.wfile.write(cmd + "\n")
                return
try:
        # Create a web server and define the handler to manage the
        # incoming request
        server = HTTPServer(('', PORT_NUMBER), myHandler)
        print 'Started httpserver on port ' , PORT_NUMBER

        # Wait forever for incoming http requests
        server.serve_forever()

except KeyboardInterrupt:
        print '^C received, shutting down the web server'
        server.socket.close()
0
ответ дан Frank Chang 4 September 2018 в 07:47
поделиться

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

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

UPDATE

Поскольку этот ответ продолжает подниматься, я хочу добавить заметку о том, что учетная запись, используемая для вызова скрипта, должна быть учетной записью без каких-либо разрешений, но только выполнение этого скрипта как sudo (это можно сделать из sudoers).

17
ответ дан Mohammed Noureldin 4 September 2018 в 07:47
поделиться

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

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

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

2
ответ дан user2915097 4 September 2018 в 07:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: