Да, вы должны объявить в «конструкторе», если хотите, чтобы список стал свойством объекта, а не свойством класса.
Это ДЕЙСТВИТЕЛЬНО зависит от того, что вам нужно, чтобы выполнить скрипт 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
. Но на этом этапе вам действительно нужно знать, что делает скрипт, чтобы разрешить конкретные разрешения, необходимые для вашего хоста изнутри контейнера.
Используется именованный канал. На хосте os создайте сценарий для циклического и считывания команд, а затем вы вызовете eval.
Попросите контейнер докеров прочитать этот именованный канал.
Чтобы иметь доступ к каналу, вам необходимо установить его через том.
Это аналогично механизму SSH (или аналогичному методу на основе сокетов), но ограничивает вас правильным хост-устройством, что, вероятно, лучше. Кроме того, вам не нужно передавать информацию об аутентификации.
Мое единственное предупреждение - быть осторожным в том, почему вы это делаете. Это абсолютно необходимо сделать, если вы хотите создать метод для самостоятельного обновления с помощью пользовательского ввода или что-то еще, но вы, вероятно, не хотите вызывать команду для получения некоторых данных конфигурации, поскольку надлежащим способом было бы передать это как аргументы / том в докер. Также будьте осторожны в том, что вы уклоняетесь, поэтому просто дайте модели разрешения мысли.
Некоторые из других ответов, таких как запуск сценария. По объему не будут работать в общем случае, поскольку у них не будет доступа к полным системным ресурсам, но он может быть более уместным в зависимости от вашего использования .
Чтобы расширить user2915097's response :
Идея изоляции состоит в том, чтобы иметь возможность ограничить то, что приложение / процесс / контейнер (независимо от вашего угол в этом случае) может очень эффективно работать с хост-системой. Следовательно, возможность копирования и выполнения файла действительно разрушит всю концепцию.
Да. Но иногда это необходимо.
blockquote>No. Это не тот случай, или Docker не подходит. Что вы должны сделать, так это объявить четкий интерфейс для того, что вы хотите сделать (например, обновить конфигурацию хоста) и написать минимальный клиент / сервер, чтобы сделать точно , и ничего больше. Однако, как правило, это не очень желательно. Во многих случаях вам следует просто пересмотреть свой подход и искоренить эту потребность. Докер пришел в существование, когда в основном все было услугой, доступной по протоколу. Я не могу придумать какой-либо надлежащий порядок использования контейнера Docker, получающего права на выполнение произвольных действий на хосте.
Напишите простой сервер 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()
Я знаю, что это старый вопрос, но идеальным решением может быть подключение к узлу над SSH
и выполнение команды следующим образом:
ssh -l ${USERNAME} ${HOSTNAME} "${SCRIPT}"
Поскольку этот ответ продолжает подниматься, я хочу добавить заметку о том, что учетная запись, используемая для вызова скрипта, должна быть учетной записью без каких-либо разрешений, но только выполнение этого скрипта как sudo (это можно сделать из sudoers
).
Как напоминает Маркус, докер - это в основном изоляция процесса. Начиная с docker 1.8, вы можете копировать файлы в обоих направлениях между хостом и контейнером, см. Документ docker cp
https://docs.docker.com/reference/commandline/cp /
Как только файл скопирован, вы можете запустить его локально