【问题标题】:Docker container CPU and Memory UtilizationDocker 容器 CPU 和内存利用率
【发布时间】:2017-09-25 08:26:36
【问题描述】:

我的 Jenkins 作业中有一个使用此命令运行的 Docker 容器:

docker run --name="mydoc" reportgeneration:1.0 start=$START end=$END config=$myfile

这很好用。该映像是从 DockerFile 创建的,该文件正在使用 ENTRYPOINT 执行 shell 脚本。

现在我想知道这个容器使用了多少 CPU 和内存。我正在使用 Jenkins 作业,在“执行 shell 命令”中,我正在运行上述 Docker 运行命令。

我看到了“docker stats”命令。它在我的 Ubuntu 机器上运行良好。但我希望它通过 Jenkins 运行,因为我的容器通过 Jenkins 控制台运行。所以这里遵循我的限制。

  1. 不知道有没有办法停止docker stats 命令。在 Ubuntu 命令行中,我们点击“ctrl+c”来停止它。我将如何在 Jenkins 中做到这一点?
  2. 即使我找到了停止docker stats 的方法,一旦执行了“docker run”命令,容器将不会处于活动状态并会退出。对于退出的容器,CPU 和内存利用率将为零。
docker run 'image' 

docker stats container id/name

通过以上两行,docker stats 命令只会得到一个退出的容器,我认为docker stats 甚至无法与 Jenkins 控制台一起使用,因为它无法停止。

有什么方法可以通过 Jenkins 控制台更好地获取容器的资源利用率(CPU、内存)?

【问题讨论】:

    标签: memory docker jenkins cpu


    【解决方案1】:

    建议不要以交互方式运行docker stats,而是有一段带有这样循环的shell脚本:

    #!/bin/sh
    
    # First, start the container
    CONTAINER_ID=$(docker run -d ...)
    
    # Then start watching that it's running (with inspect)
    while [ "$(docker inspect -f {{.State.Running}} $CONTAINER_ID 2>/dev/null)" = "true" ]; do
        # And while it's running, check stats
        docker stats --no-stream $CONTAINER_ID
        sleep 1
    done
    
    # When the script reaches this point, the container had stopped.
    # For example, let's clean it up (assuming you haven't used --rm in run).
    docker rm $CONTAINER_ID
    

    条件checks whenever the container is running 与否,docker stats --no-stream 打印一次然后退出,使其适合非交互使用。

    我相信您可以使用此类 shell 脚本文件的变体(显然,已更新以做一些有用的事情,而不仅仅是启动容器并查看其统计信息)as a build step


    但是,如果您需要/想要/拥有想要停止的交互式进程,kill 就是您要查找的命令。 Ctrl-C 在终端just sends a SIGINT 到进程。

    当然,您需要知道 PID。我不确定 Jenkins,但如果您刚刚使用 child-process &(例如 docker stats &)从 shell 脚本启动了一个子进程,那么它的 PID 将是 in the $! variable。或者您可以尝试使用pidofps 命令来计算它,但这可能在并发作业的情况下容易出错(除非它们都是孤立的)。

    在这里,我假设您的 Jenkins 作业是执行实际工作的 shell 脚本。如果您的设置不同(例如,如果您使用一些插件,以便 Jenkins 直接与 Docker 对话),事情可能会有所不同并且更加复杂。

    【讨论】:

    • 非常感谢 drdaemon。就我而言,这对“docker stats”问题有很大帮助。我可以在 Jenkins 中运行它。您能否帮助我理解/指导,我怎样才能同时实现上述两个语句('docker run'和'docker stats')?当我运行 docker run 时,容器退出,然后 docker stats 给我零 CPU 和内存(基本上是第 2 点)。现在我在不同的作业中执行,因此手动触发作业。
    • @Raji 我没怎么用过 Jenkins(那是几年前的事了),所以不能说出确切的步骤,但我认为最简单的方法是创建一个包含所有命令,并让 Jenkins 运行它 (stackoverflow.com/a/40888664/116546)。逻辑是,匹配runstats 命令需要在单个作业中才能正常工作(将它们放在不同的作业中会导致不必要的复杂化)。当您需要以特定顺序运行一些命令时,shell 脚本很简单但非常灵活,带有循环等(IIRC,Jenkins 的构建步骤没有循环)。
    • 用一个稍微好一点的例子更新了答案,shell 脚本的外观,包括使用 shell 脚本作为 Jenkins CI 构建步骤的链接(与上面的评论相同)。希望这会有所帮助。
    • 非常感谢 Drdaeman :) 我会检查它并将两者都放在同一个 Jenkins 工作中。再次感谢!!
    • watch -n1 docker stats
    猜你喜欢
    • 2017-05-19
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 2017-03-30
    • 1970-01-01
    相关资源
    最近更新 更多