docker - 使用 Jenkins 和 docker 插件限制 cpu

标签 docker jenkins

我有一个使用 Docker 容器作为构建从站的 Jenkins 设置。

容器通过 Docker 插件配置为代理 - 而不是实例化容器的 Jenkinsfiles。

机器是 8 线程 i7,16GB 内存和 16GB 交换文件。目前我只运行一个容器。

如果容器中的构建使用所有 8 个线程,则似乎会导致在构建时操作系统 OOM 杀死一些 GCC 进程。构建任务混合在一起,有些我可以明确控制生成线程的数量,其他的它会查询系统的核心数量并扩大范围。当有最大数量的线程处于事件状态时,它似乎会用完 RAM 而不会限制或停止工作 - 它似乎也没有充分利用交换空间。

我想限制 Docker slave 允许使用的 CPU 内核数量,但我找不到将 --cpus=2 参数传递给 Docker run 命令的方法。 shares 参数似乎没有达到我想要的效果。

我很乐意从容器配置中显式分配资源,以使服务器更可靠,但我不希望它遇到硬限制并导致 OOM 终止。

最佳答案

我不太确定您是如何启动 Docker 容器的,但如果您借助插件来启动,我猜您会在 Jenkins 文件中进行调用,例如 myImage.inside("...")。在这种情况下,您应该能够添加“--cpus=2”作为字符串参数的一部分。这至少对我们有用。

然而,此解决方案的缺点是所有 Jenkins 作业都必须更新,您永远无法确定 Jenkins 作业的所有创建者都记得这一点。因此,我们实现了一个不同的解决方案,如果上述解决方案不起作用,它应该适合您。当任何人调用 docker 时,我们基本上创建了一个脚本作为包装器。如果调用“docker run”,它会注入(inject)“--cpus=2”。否则它只是将调用转发给 Docker。我们通过以下方式实现了这一目标:

  1. 将以下脚本放入/home/jenkins/bin/docker 。 (“docker”是文件,不是文件夹)
    #!/bin/bash

    echo COMMAND: $0 with arguments: $@ >&2

    if [ "$1" = 'run' ] ; then
            echo 'INFO: I found a "run" command, limiting to 2 cpus' >&2

            echo RUNNING: /usr/bin/docker "$1" --cpus=2 "${@:2}" >&2
            /usr/bin/docker "$1" --cpus=2 "${@:2}"
    else
            echo RUNNING: /usr/bin/docker "$@" >&2
            /usr/bin/docker "$@"
    fi
  1. 让它可执行
    chmod a+x /home/jenkins/bin/docker
  1. 通过更新 ~/.bashrc 修改路径。 (~/.bash_profile 仅在您登录时生效,这意味着 Jenkins 不会接收它。)将“/home/jenkins/bin”放在路径的第一位,例如。 g.
    PATH=/home/jenkins/bin:$PATH

关于docker - 使用 Jenkins 和 docker 插件限制 cpu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58193256/

相关文章:

wordpress - 卷安装的 docker-compose/wordpress 权限错误

python - 使用 headless Chrome运行Selenium的AWS Lambda容器在本地工作,但不在AWS Lambda中工作

encoding - Perforce 和 Jenkins 更改注释编码被破坏

jenkins - Jenkins 登录错误

android - Crashlytics:使用构建服务器发布和上传 Android 应用程序的分发

apache - 运行Docker镜像时的“no such file or directory”

docker - 为什么从 Travis CI 推送后 Docker 镜像没有出现在 Docker Hub 上

docker - 在docker上连接erlang节点

java - Rundeck json作业选项过滤

javascript - 根据Python字典中的数据绘制条形图