コマンドを起動して閉じるmy_image
というDockerイメージがあります。
コマンドdocker run --rm my_image
を使用してコンテナ内でイメージを実行する場合、コンテナの実行時間を測定することはできますか?
編集:
コンテナの実行後にこれらのタイミング情報を確認する必要があるため、time
コマンドを使用できません。
--rm
が使用されていても、dockerによって保持されているコンテナの実行履歴を見つけたいと思っていました。しかし、それが存在しない場合は、@ 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)
そして、これら2つを引くと、秒単位の期間が得られます。
echo $(($STOP_TIMESTAMP-$START_TIMESTAMP)) seconds
9 seconds
別の可能なアプローチは、デフォルトの entrypoint を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
コンテナの起動だけにかかる時間を確認します。
あなたはいくつかのことを考慮しなければなりません:
docker exec
を実行します。Dockerコンテナの実行時間を取得する2つのことを組み合わせると、
docker exec -ti <container_id> ps -o etime= -p "1"
docker ps
コマンドの列[〜#〜] status [〜#〜]よりも正確です。
コンテナ内で複数のプロセスを実行していて、それらのいずれかの実行時間が必要な場合は、「1」をコンテナ内のPIDに置き換えるだけです。