我有一个名为my_image
的Docker镜像,它启动一个命令并关闭。
当使用命令docker run --rm my_image
在容器中运行镜像时,是否可以测量容器的执行时间?
编辑:
我需要在容器执行后查看这些时间信息,因此无法使用time
命令。
我希望能够找到由Docker保留的一些容器执行历史记录,即使使用了--rm
。但如果不存在,则适用@tgogos的答案。
目标是比较几个镜像的执行时间,以得出有关使用不同工具的结论。
我有一个名为my_image
的Docker镜像,它启动一个命令并关闭。
当使用命令docker run --rm my_image
在容器中运行镜像时,是否可以测量容器的执行时间?
编辑:
我需要在容器执行后查看这些时间信息,因此无法使用time
命令。
我希望能够找到由Docker保留的一些容器执行历史记录,即使使用了--rm
。但如果不存在,则适用@tgogos的答案。
目标是比较几个镜像的执行时间,以得出有关使用不同工具的结论。
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变量中,例如:
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
,以查看仅容器启动所需的时间。
您需要考虑以下几点:
docker exec
指定PID=1,因为容器运行时间=entrypoint运行时间。将这两个步骤结合起来,您就可以获得docker容器的执行时间:
docker exec -ti <container_id> ps -o etime= -p "1"
docker ps
命令的状态列提供更精确的信息。