测量Docker容器的执行时间

时间:2018-08-02 09:44:33

标签: docker time docker-container

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

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

编辑:

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

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

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

3 个答案:

答案 0 :(得分:4)

第一种方法: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日( seconds )

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

如果减去这两个,则持续时间以秒为单位...

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

答案 1 :(得分:1)

您必须考虑以下几点:

  1. 在给定PID的情况下,如何使时间得以执行。
  2. 执行docker exec,指定PID = 1,因为运行容器时间=正在运行入口点。

将获得Docker容器时间执行的两件事结合起来:

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

docker ps命令的 STATUS 列相比,它具有更高的准确性。

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

答案 2 :(得分:1)

另一种可能的方法可能是使用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来查看容器启动需要多长时间。