web-dev-qa-db-ja.com

Dockerコンテナの実行時間を測定する

コマンドを起動して閉じるmy_imageというDockerイメージがあります。

コマンドdocker run --rm my_imageを使用してコンテナ内でイメージを実行する場合、コンテナの実行時間を測定することはできますか?

編集:

コンテナの実行後にこれらのタイミング情報を確認する必要があるため、timeコマンドを使用できません。

--rmが使用されていても、dockerによって保持されているコンテナの実行履歴を見つけたいと思っていました。しかし、それが存在しない場合は、@ tgogosの回答が適しています。

目標は、いくつかの画像の実行時間を比較して、使用されているさまざまなツールについて結論を出すことです。

6
matthiasbe

最初のアプローチ: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エポックタイムスタンプに変換できます( 1970年1月1日以降。(UTC))

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

そして、これら2つを引くと、秒単位の期間が得られます。

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

別の可能なアプローチは、デフォルトの entrypointtimeコマンドでオーバーライドすることです。

$ 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
Jack Gore

あなたはいくつかのことを考慮しなければなりません:

  1. PIDを指定してプロセスの実行時間を取得する方法。
  2. コンテナ時間実行=エントリポイント実行のため、PID = 1を指定してdocker execを実行します。

Dockerコンテナの実行時間を取得する2つのことを組み合わせると、

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

docker psコマンドの列[〜#〜] status [〜#〜]よりも正確です。

コンテナ内で複数のプロセスを実行していて、それらのいずれかの実行時間が必要な場合は、「1」をコンテナ内のPIDに置き換えるだけです。

1
mulg0r