Docker 容器 CPU 和内存利用率
Docker container CPU and Memory Utilization
我有一个 Docker 容器 运行 我的 Jenkins 作业中有这个命令:
docker run --name="mydoc" reportgeneration:1.0 start=$START end=$END config=$myfile
这个效果很好。该图像是从 Docker 文件创建的,该文件正在使用 ENTRYPOINT
.
执行 shell 脚本
现在我想知道这个容器使用了多少 CPU 和内存。我正在使用 Jenkins 作业,在 "execute shell command" 中,我正在 运行 上面的 Docker 运行 命令。
我看到了关于 'docker stats' 命令。它在我的 Ubuntu 机器上运行良好。但我希望它通过 Jenkins 运行,因为我的容器是通过 Jenkins 控制台 运行ning。所以这里遵循我的限制。
- 不知道有没有办法停止
docker stats
命令。在 Ubuntu 命令行中,我们点击 'ctrl+c' 来停止它。我将如何在 Jenkins 中完成?
- 即使我想出停止
docker stats
的方法,一旦执行 'docker run' 命令,容器将不会处于活动状态并会退出。对于退出的容器,CPU 和内存利用率将为零。
docker run 'image'
docker stats container id/name
通过以上两行,docker stats
命令只会得到一个退出的容器,我认为 docker stats
甚至无法与 Jenkins 控制台一起使用,因为它无法停止。
有什么方法可以通过 Jenkins 控制台更好地获取容器的资源利用率(CPU、内存)?
建议不要 运行 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.
但是如果您 need/want/have 一个您想停止的交互式进程,kill
就是您正在寻找的命令。终端中的 Ctrl-C just sends a SIGINT 到进程。
当然,您需要知道 PID。我不确定 Jenkins,但是如果您刚刚从 shell 脚本中使用 child-process &
(例如 docker stats &
)启动子进程,那么它的 PID 将是 in the $!
variable.或者您可以尝试使用 pidof
或 ps
命令来计算它,但是在并发作业的情况下这可能容易出错(除非它们都是孤立的)。
这里我假设您的 Jenkins 作业是执行实际工作的 shell 脚本。如果您的设置不同(例如,如果您使用一些插件,那么 Jenkins 直接与 Docker 对话),事情可能会有所不同并且更加复杂。
我有一个 Docker 容器 运行 我的 Jenkins 作业中有这个命令:
docker run --name="mydoc" reportgeneration:1.0 start=$START end=$END config=$myfile
这个效果很好。该图像是从 Docker 文件创建的,该文件正在使用 ENTRYPOINT
.
现在我想知道这个容器使用了多少 CPU 和内存。我正在使用 Jenkins 作业,在 "execute shell command" 中,我正在 运行 上面的 Docker 运行 命令。
我看到了关于 'docker stats' 命令。它在我的 Ubuntu 机器上运行良好。但我希望它通过 Jenkins 运行,因为我的容器是通过 Jenkins 控制台 运行ning。所以这里遵循我的限制。
- 不知道有没有办法停止
docker stats
命令。在 Ubuntu 命令行中,我们点击 'ctrl+c' 来停止它。我将如何在 Jenkins 中完成? - 即使我想出停止
docker stats
的方法,一旦执行 'docker run' 命令,容器将不会处于活动状态并会退出。对于退出的容器,CPU 和内存利用率将为零。
docker run 'image'
docker stats container id/name
通过以上两行,docker stats
命令只会得到一个退出的容器,我认为 docker stats
甚至无法与 Jenkins 控制台一起使用,因为它无法停止。
有什么方法可以通过 Jenkins 控制台更好地获取容器的资源利用率(CPU、内存)?
建议不要 运行 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.
但是如果您 need/want/have 一个您想停止的交互式进程,kill
就是您正在寻找的命令。终端中的 Ctrl-C just sends a SIGINT 到进程。
当然,您需要知道 PID。我不确定 Jenkins,但是如果您刚刚从 shell 脚本中使用 child-process &
(例如 docker stats &
)启动子进程,那么它的 PID 将是 in the $!
variable.或者您可以尝试使用 pidof
或 ps
命令来计算它,但是在并发作业的情况下这可能容易出错(除非它们都是孤立的)。
这里我假设您的 Jenkins 作业是执行实际工作的 shell 脚本。如果您的设置不同(例如,如果您使用一些插件,那么 Jenkins 直接与 Docker 对话),事情可能会有所不同并且更加复杂。