限制循环执行的 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 选项,因为它看起来像 您正在 运行非交互地执行这些测试。

另外几个可能的解决方案:

  1. 如果您 运行 在 jenkins 中进行测试,则可以创建一个 运行 包含一个测试套件的作业。将执行者的最大数量设置为 6。并根据需要启动任意数量的测试。现在 jenkins 一次不会让 运行 超过 6 个作业。

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