限制在循环中执行的docker容器



我是docker的新手,创建了一个Dockerfile来创建一个执行量角器测试的图像。

Dockerfile有一个入口点,它需要一个我想要执行的Suite Name参数。

当我在命令行中提供套件名称时,一切都运行得很好。我有大约30个测试套件,我正在使用另一个.sh文件来过滤套件名称,在for循环中,它运行具有不同套件名称的docker命令。

现在,我不想同时推出30套套房,而是想设定一次6套的限制,让其他人等到一套完成。

我这样执行:

for (( i=0; i<${tests}; i++ ));
do
docker run -dit containername $testSuiteName
done

那么,我如何限制一次执行的最大次数呢?

有很多方法可以解决这个问题。在这里是一种可能的解决方案。

您可以将其视为shell脚本问题,而不是Docker问题。例如,考虑以下内容,它不使用docker run ...,而只使用sleep:

#!/bin/sh
let count=5
let tests=20
for (( i=0; i<tests; i++ )); do
sleep $((RANDOM % 10)) &
echo "started $!"
let count--
if (( count <= 0 )); then
wait -n
let count++
fi
done
echo "waiting for remaining jobs"
wait
echo "all done"

这将并行启动$count进程,然后等待一个进程出口当一个进程退出时,它会立即启动一个新的进程。一旦已经开始了所有的工作,它只是等待一切结束。

使用此模型,您可以从docker run中删除-d命令行,因为您需要shell来跟踪背景过程。您将运行:而不是sleep ... &

docker run containername $testSuiteName > /dev/null 2>&1 &

请注意,我在这里删除了-i-t选项,因为它看起来像您正在以非交互方式运行这些测试。

更多可能的解决方案:

  1. 如果您在jenkins中运行测试,您可以创建一个运行一个测试套件的作业。将执行程序的最大数目设置为6。并开始尽可能多的测试。现在詹金斯不会让一次运行超过6个作业。

  2. 我认为这是最理想、最正确的方法,也是最困难的方法。你可以用一个管弦乐器作为kubernetes。这实际上控制了你所有的docker图像。不幸的是,我没有一步一步指导如何实现。但这确实是解决问题的最专业的方法

相关内容

  • 没有找到相关文章

最新更新