【问题标题】:Limit the docker containers executed in a loop限制循环执行的 docker 容器
【发布时间】:2021-09-21 17:47:04
【问题描述】:

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

该 Dockerfile 有一个入口点,该入口点需要一个带有我要执行的套件名称的参数。

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

现在我不想同时晒 30 间套房,但想一次设置 6 间的限制,并希望让其他人等到一间完成。

我是这样执行的:

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

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

【问题讨论】:

    标签: docker protractor sh


    【解决方案1】:

    将有多种方法来解决这个问题。这里 是一种可能的解决方案。

    您可以将此视为 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 ... &amp;,你会运行:

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

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

    【讨论】:

    • 谢谢,这看起来很有希望,现在将对其进行测试。
    • 谢谢伙计,这很有魅力。你对 docker 和 shell 脚本都有很好的了解。
    【解决方案2】:

    更多可能的解决方案:

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

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

    【讨论】:

    • 谢谢,谢尔盖,是的,我必须以某种方式将它添加到 Jenkins,但也希望为我的本地运行提供解决方案。所以是的,我会为 Jenkins 采用这种方法,并为本地采用上述答案。
    猜你喜欢
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 2021-03-29
    相关资源
    最近更新 更多