4

I'm trying to automate the following loop with Docker: spawn a container, do some work inside of it (more than one single command), get some data out of the container.

Something along the lines of:

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

According to the documentation I should go with:

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

Unfortunately, this approach is not attractive nor maintanable as the list of instructions grows in complexity.

Wrapping the instructions in a script as in docker run <image> /bin/bash script.sh doesn't work either since I want to spawn a new container for every iteration of the loop.

To sum up:

  1. Is there any sensible way to run a complex series of commands as described above inside the same container?

  2. Once some data are saved inside a container in, say, /home/results.txt, and the container returns, how do I get results.txt? The only way I can think of is to commit the container and tar the file out of the new image. Is there a more efficient way to do it?

Bonus: should I use vanilla LXC instead? I don't have any experience with it though so I'm not sure. Thanks.

4

3 回答 3

3

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

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

细节:

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

举一个(Python)示例,您可能有一个Container类:

1) 一种通过 sshd 启动并运行本地生成新容器的方法,例如

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

2) 设置 Fabric 连接到正在运行的容器所需的 env 参数 - 查看Fabric 的教程以获取更多信息

3) 编写你的方法来在容器中运行你想要的一切,利用 Fabric 的运行,例如

run('uname -on')

哦,如果你更喜欢 Ruby,你可以使用Capistrano来达到同样的效果。

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

于 2013-07-06T19:01:55.973 回答
1

关于问题 2。

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

于 2013-07-02T07:26:59.580 回答
0

您将 2 个问题合二为一。也许您应该将 2. 放在不同的帖子中。我会考虑 1. 这里。

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

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

于 2013-07-01T12:13:53.470 回答