测量 docker 个容器的执行时间

Measure execution time of docker container

我有一个名为 my_image 的 docker 图像,它启动命令并关闭。

当运行容器中的镜像使用命令docker run --rm my_image时,是否可以测量容器的执行时间?

编辑:

我需要在容器执行后查看那些计时信息,因此我不能使用 time 命令。

我不知何故希望找到 docker 保存的一些容器执行历史记录,即使使用了 --rm。但如果它不存在,那么@tgogos 的答案是合适的。

目标是比较多个图像的执行时间,以得出有关所使用的不同工具的结论。

你必须考虑几件事:

  1. 如何在给定 PID 的情况下获取进程的执行时间。
  2. 执行 docker exec 指定 PID=1 因为容器时间 运行 = 入口点 运行.

结合两件事你得到docker容器时间执行:

docker exec -ti <container_id> ps -o etime= -p "1"

它比 docker ps 命令的 STATUS 列更准确。

如果您在容器中执行多个进程并且您需要其中任何一个的执行时间,只需将“1”替换为其在容器内的 PID。

第一种方法:time

time docker run --rm --name=test alpine ping -c 10 8.8.8.8
...

real    0m10.261s
user    0m0.228s
sys 0m0.044s

但这也包括创建删除容器的时间。

第二种方法:容器信息

您要查找的信息由 docker 存储,可以通过 docker container inspect 访问。

docker run --name=test alpine ping -c 10 8.8.8.8

* 注意我没有使用 --rm 因为下一步是检查容器。之后您必须将其删除。您可能感兴趣的时间戳是:

  • "Created": "2018-08-02T10:16:48.59705963Z",
  • "StartedAt": "2018-08-02T10:16:49.187187456Z",
  • "FinishedAt": "2018-08-02T10:16:58.27795818Z"

$ docker container inspect test

[
    {
        "Id": "96e469fdb437814817ee2e9ad2fcdbf468a88694fcc998339edd424f9689f71f",
        "Created": "2018-08-02T10:16:48.59705963Z",
        "Path": "ping",
        "Args": [
            "-c",
            "10",
            "8.8.8.8"
        ],
        "State": {
            "Status": "exited",
            "Running": false,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 0,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2018-08-02T10:16:49.187187456Z",
            "FinishedAt": "2018-08-02T10:16:58.27795818Z"
        }
...

持续时间计算示例(bash):

您可以使用如下单个命令将这些时间戳放入 bash 变量中:

START=$(docker inspect --format='{{.State.StartedAt}}' test)
STOP=$(docker inspect --format='{{.State.FinishedAt}}' test)

然后您可以将它们转换为 UNIX 纪元时间戳(自 1970 年 1 月 1 日以来。(UTC))

START_TIMESTAMP=$(date --date=$START +%s)
STOP_TIMESTAMP=$(date --date=$STOP +%s)

如果你减去这两个,你得到以秒为单位的持续时间...

echo $(($STOP_TIMESTAMP-$START_TIMESTAMP)) seconds
9 seconds

另一种可能的方法是使用 time 命令覆盖默认值 entrypoint

$ docker run --rm --name=test --entrypoint=time alpine ping -c 10 8.8.8.8

PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=37 time=51.213 ms
64 bytes from 8.8.8.8: seq=1 ttl=37 time=7.844 ms
64 bytes from 8.8.8.8: seq=2 ttl=37 time=8.120 ms
64 bytes from 8.8.8.8: seq=3 ttl=37 time=10.859 ms
64 bytes from 8.8.8.8: seq=4 ttl=37 time=10.975 ms
64 bytes from 8.8.8.8: seq=5 ttl=37 time=12.520 ms
64 bytes from 8.8.8.8: seq=6 ttl=37 time=7.994 ms
64 bytes from 8.8.8.8: seq=7 ttl=37 time=8.904 ms
64 bytes from 8.8.8.8: seq=8 ttl=37 time=6.674 ms
64 bytes from 8.8.8.8: seq=9 ttl=37 time=7.132 ms

--- 8.8.8.8 ping statistics ---
10 packets transmitted, 10 packets received, 0% packet loss
round-trip min/avg/max = 6.674/13.223/51.213 ms
real    0m 9.02s
user    0m 0.00s
sys 0m 0.00s

这样做不会包括容器启动时间。你甚至可以这样做: time docker run --rm --name=test --entrypoint=time alpine ping -c 10 8.8.8.8 查看容器启动需要多长时间。