Измерьте время выполнения докера
У меня есть изображение докера my_image
который запускает команду и закрывается.
При запуске изображения в контейнере с помощью команды docker run --rm my_image
Можно ли измерить время выполнения контейнера?
Редактировать:
Мне нужно увидеть эту информацию о времени после выполнения контейнера, поэтому я не могу использовать time
команда.
Я как-то надеялся найти некоторую историю выполнения контейнера, сохраненную докером, даже если --rm
использовался. Но если он не существует, то ответ @tgogos подходит.
Цель состоит в том, чтобы сравнить время выполнения нескольких изображений, чтобы сделать вывод о различных используемых инструментах.
3 ответа
1-й подход: time
time docker run --rm --name=test alpine ping -c 10 8.8.8.8
...
real 0m10.261s
user 0m0.228s
sys 0m0.044s
но это также будет включать время создания и удаления контейнера.
2-й подход: информация о контейнере
Информация, которую вы ищете, хранится в 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 (секунды с 01 января 1970 года. (UTC))
START_TIMESTAMP=$(date --date=$START +%s)
STOP_TIMESTAMP=$(date --date=$STOP +%s)
и если вы вычтете эти два, вы получите продолжительность в секундах...
echo $(($STOP_TIMESTAMP-$START_TIMESTAMP)) seconds
9 seconds
Другим возможным подходом может быть переопределение точки входа по умолчанию с помощью time
команда.
$ 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
чтобы увидеть, сколько времени занимает запуск контейнера.
Вы должны рассмотреть несколько вещей:
- Как получить время выполнения процесса с заданным PID.
- казнить
docker exec
указание PID=1, потому что время контейнера работает = точка входа работает.
Комбинируя две вещи, вы получаете время выполнения контейнера Docker:
docker exec -ti <container_id> ps -o etime= -p "1"
Это дает вам больше точности, чем в столбце СОСТОЯНИЕ docker ps
команда.
Если вы выполняете несколько процессов в контейнере и вам нужно время выполнения для любого из них, просто замените "1" его PID внутри контейнера.