Измерьте время выполнения докера

У меня есть изображение докера 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 чтобы увидеть, сколько времени занимает запуск контейнера.

Вы должны рассмотреть несколько вещей:

  1. Как получить время выполнения процесса с заданным PID.
  2. казнить docker exec указание PID=1, потому что время контейнера работает = точка входа работает.

Комбинируя две вещи, вы получаете время выполнения контейнера Docker:

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

Это дает вам больше точности, чем в столбце СОСТОЯНИЕ docker ps команда.

Если вы выполняете несколько процессов в контейнере и вам нужно время выполнения для любого из них, просто замените "1" его PID внутри контейнера.

Другие вопросы по тегам