限制循环执行的 docker 个容器
Limit the docker containers executed in a loop
我是 docker 的新手,已经创建了一个 Dockerfile 来创建执行量角器测试的图像。
那个 Dockerfile 有一个入口点,它需要一个带有我要执行的套件名称的参数。
当我在命令行中提供套件名称时,一切都运行良好。
我有大约 30 个测试套件,我正在使用另一个过滤掉套件名称的 .sh 文件,并且在 for 循环中,它运行 docker 具有不同套件名称的命令。
现在我不想同时晒 30 间套房,而是想设置一个限制,比如一次晒 6 间,并想让其他人等到一个晒完。
我是这样执行的:
for (( i=0; i<${tests}; i++ ));
do
docker run -dit containername $testSuiteName
done
那么如何限制一次最大执行次数呢?
有多种方法可以解决这个问题。这里
是一种可能的解决方案。
您可以将其视为 shell 脚本问题,而不是 Docker 问题。例如,考虑以下内容,它使用 sleep
:
而不是 docker run ...
#!/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。并根据需要启动任意数量的测试。现在 jenkins 一次不会让 运行 超过 6 个作业。
这是我认为最理想也是最正确的方法,也是最难的一种方法。您可以将编排器用作 kubernetes。这实际上控制了您所有的 docker 图像。不幸的是,我没有一步一步的指导如何实现。但这确实是解决你问题的最专业的方法
我是 docker 的新手,已经创建了一个 Dockerfile 来创建执行量角器测试的图像。
那个 Dockerfile 有一个入口点,它需要一个带有我要执行的套件名称的参数。
当我在命令行中提供套件名称时,一切都运行良好。 我有大约 30 个测试套件,我正在使用另一个过滤掉套件名称的 .sh 文件,并且在 for 循环中,它运行 docker 具有不同套件名称的命令。
现在我不想同时晒 30 间套房,而是想设置一个限制,比如一次晒 6 间,并想让其他人等到一个晒完。
我是这样执行的:
for (( i=0; i<${tests}; i++ ));
do
docker run -dit containername $testSuiteName
done
那么如何限制一次最大执行次数呢?
有多种方法可以解决这个问题。这里 是一种可能的解决方案。
您可以将其视为 shell 脚本问题,而不是 Docker 问题。例如,考虑以下内容,它使用 sleep
:
docker run ...
#!/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。并根据需要启动任意数量的测试。现在 jenkins 一次不会让 运行 超过 6 个作业。
这是我认为最理想也是最正确的方法,也是最难的一种方法。您可以将编排器用作 kubernetes。这实际上控制了您所有的 docker 图像。不幸的是,我没有一步一步的指导如何实现。但这确实是解决你问题的最专业的方法