在同一个Docker容器中运行一系列复杂的命令

时间:2013-06-30 19:02:47

标签: lxc 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>

不幸的是,随着指令列表的复杂性增加,这种方法既不具吸引力也不具有可维护性。

docker run <image> /bin/bash script.sh中编写脚本中的指令也不起作用,因为我想为循环的每次迭代生成一个 new 容器。

总结一下:

  1. 有没有合理的方法来运行复杂的系列 如上所述的命令在同一容器内?

  2. 一旦某些数据保存在容器中,例如/home/results.txt, 并且容器返回,我如何获得results.txt?唯一的方法我 可以想到的是提交容器和tar文件 新图片。有没有更有效的方法呢?

  3. 奖金:我应该使用香草LXC吗?我没有任何经验,所以我不确定。 感谢。

3 个答案:

答案 0 :(得分:3)

我最终想出了一个适合我的解决方案,并极大地改善了我的Docker体验。

长话短说:我使用了Fabric和运行sshd的容器的组合。

<强>详细信息:

我们的想法是使用Fabric的 local 生成运行sshd的容器,并使用Fabric的运行在容器上运行命令。

要给出一个(Python)示例,您可能有一个 Container 类,其中包含:

1)本地在sshd启动并运行的情况下生成新容器的方法,例如

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

2)设置Fabric所需的env参数以连接到正在运行的容器 - 有关此内容的更多信息,请查看Fabric's tutorial

3)编写你的方法来运行你想要的所有东西在容器中利用Fabric的运行,例如。

run('uname -on')

哦,如果你更喜欢Ruby,你可以使用Capistrano来实现同样的目标。

感谢@qkrijger(+ 1'd)让我走上正轨:)

答案 1 :(得分:1)

问题2。

我不知道这是不是最好的方法,但你可以在你的图像上安装SSH并使用它。有关此问题的更多信息,您可以从文档中查看this page

答案 2 :(得分:0)

您将2个问题合二为一。也许你应该把2.放在另一篇文章中。我会在这里考虑1.

我不清楚你是想为每次迭代生成一个新容器(正如你先说的那样),还是想要“在同一个容器中运行如上所述的一系列复杂命令?” em>“正如你稍后所说。

如果你想生成多个容器,我希望你的机器上有一个处理它的脚本。 如果你需要将一个参数传递给你的容器(比如i):目前正在完成传递参数的工作。请参阅https://github.com/dotcloud/docker/pull/1015(和https://github.com/dotcloud/docker/pull/1015/files以了解尚未在线的文档更改。)