2013-06-30 3 views
4

Я пытаюсь автоматизировать следующий цикл с помощью Docker: создать контейнер, выполнить некоторую работу внутри него (более одной команды), получить некоторые данные контейнера.Запустите сложную серию команд в одном контейнере Docker

Что-то вдоль линий:

for (i = 0; i < 10; i++) 
    spawn a container 
    wget revision-i 
    do something with it and store results in results.txt 

Согласно документации, которую я должен идти с:

for (...) 
    docker run <image> <long; list; of; instructions; separated; by; semicolon> 

К сожалению, этот подход не является привлекательным ни maintanable как список инструкций растет по сложности ,

Обертывание инструкции в сценарии, как в docker run <image> /bin/bash script.sh не работает, либо, так как я хочу, чтобы породить новый контейнер для каждой итерации цикла.

Подводя итог:

  1. Есть ли разумный способ запустить сложную серию команд, как описано выше в том же контейнере?

  2. Как только некоторые данные сохраняются внутри контейнера, скажем, /home/results.txt, и контейнер возвращается, как я могу получить results.txt? Единственный способ, которым я могу думать, - это зафиксировать контейнер и tar файл из нового изображения . Есть ли более эффективный способ сделать это?

Бонус: следует ли вместо этого использовать ваниль LXC? У меня нет опыта, хотя я не уверен. Спасибо.

ответ

3

В итоге я придумал решение, которое работает для меня и значительно улучшило мой опыт Докера.

Short story: Использовала комбинация Fabric и контейнер, работающий на sshd.

Деталь:

Идея заключается в том, чтобы порождать контейнер (ы) с помощью SSHD под управлением локального ткани, и выполнять команды на контейнерах с использованием ткани в перспективы.

Чтобы дать (Python) пример, вы можете иметь контейнера класс с:

1) метод, чтобы локально породит новый контейнер с SSHD и работает, например,

local('docker run -d -p 22 your/image /usr/sbin/sshd -D') 

2) установить параметры ENV необходимые ткани для подключения к запущенному контейнера - проверить Fabric's tutorial подробнее об этом

3) написать свои методы, чтобы запустить все, что вы хотите в контейнере эксплуатации Ткань-х запустить, например

run('uname -on') 

Да, и если вы, как рубин лучше вы можете достичь того же с помощью Capistrano.

Благодаря @qkrijger (+ 1'd) для меня на правильном пути :)

0

Вы отправляете 2 вопроса в одном. Возможно, вы должны поставить 2. в другую должность. Я рассмотрю 1. здесь.

Непонятно, хотите ли вы создать новый контейнер для каждой итерации (как вы говорите первым), или если вы хотите «выполнить сложную серию команд, описанных выше в одном контейнере?» as вы говорите позже.

Если вы хотите создать несколько контейнеров, я ожидаю, что у вас будет скрипт на вашей машине. Если вам нужно передать аргумент в свой контейнер (например, i): в настоящее время выполняется работа над передачей аргументов. См. https://github.com/dotcloud/docker/pull/1015https://github.com/dotcloud/docker/pull/1015/files для изменения документации, который еще не подключен к сети).

1

На вопрос 2.

Я не знаю, если это лучший способ, но вы можете установить SSH на вас изображение и использовать его. Для получения дополнительной информации об этом, вы можете проверить this page из документации.

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