我是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
选项,因为它看起来像您正在以非交互方式运行这些测试。
更多可能的解决方案:
-
如果您在jenkins中运行测试,您可以创建一个运行一个测试套件的作业。将执行程序的最大数目设置为6。并开始尽可能多的测试。现在詹金斯不会让一次运行超过6个作业。
-
我认为这是最理想、最正确的方法,也是最困难的方法。你可以用一个管弦乐器作为kubernetes。这实际上控制了你所有的docker图像。不幸的是,我没有一步一步指导如何实现。但这确实是解决问题的最专业的方法