Docker は様々な仮想環境を使えるツールです。これを利用して各環境で様々なコマンドを実行する時があります。この実行について実行日時を詳しく知りたい時があります。これを知る方法を紹介します。
まず大雑把に知る方法としてdocker psコマンドを用いる方法があります。これを用いて次の様にすると最終実行日時が大雑把に現在からの相対時刻表記で表示されます。
docker ps --all --format "{{.ID}}\t{{.State}}\t{{.RunningFor}}"
# 05196088c512 exited 21 minutes ago
# 9227da6b9376 running 29 hours ago
# c9bab29f6fd3 created 4 days ago
# 881eea16b489 exited 7 days ago
# 215c1cdb6ac2 exited 5 weeks ago
単にコンソールで見るだけならばこれでも十分ですが、実際には 2022-03-22 16:13:45 の様に詳しい絶対的な日時形式で実行日時を知りたい時があります。これは次でできます。
# jq https://stedolan.github.io/jq/
docker inspect [実行日時を知りたいコンテナのID] | jq ".[] | {id: .Id, created: .Created, startedAt: .State.StartedAt, finishedAt: .State.FinishedAt}"
# 特定のコンテナの例
docker inspect 7fa92ad27a26 f171c3a706fe | jq ".[] | {id: .Id, created: .Created, startedAt: .State.StartedAt, finishedAt: .State.FinishedAt}"
# {
# "id": "7fa92ad27a2699b3cc38a9ae195329824fe7fb2be394f97bc9399c7c19dc9e43",
# "created": "2022-03-22T06:36:12.4328116Z",
# "startedAt": "0001-01-01T00:00:00Z",
# "finishedAt": "0001-01-01T00:00:00Z"
# }
# {
# "id": "f171c3a706fea0c1394e5c50372f1b56dddc7310bc3e945698167abf4b1d33c1",
# "created": "2022-03-22T06:36:05.7521639Z",
# "startedAt": "2022-03-22T06:36:07.0946451Z",
# "finishedAt": "2022-03-22T06:36:07.0953586Z"
# }
created がコンテナ作成日時、startedAt がコンテナを起動した日時、 finishedAt が起動したコンテナが終了した日時です。Docker がコンテナの実行コマンドのパスにファイルやディレクトリを見つけられない時などはコンテナは実行されず Created 状態で止まり、startedAt、finishedAt は”0001-01-01T00:00:00Z”を指すようになります。
上記例ではコンテナIDを一つ一つ渡していますがdocker psコマンドと組み合わせることによって、より広範に特定条件にあてはまるコンテナについて調べることができます。この例は次です。
# --all オプションで実行中以外のコンテナも表示
# --quiet オプションでコンテナのIDのみを表示
# --filter name=hoge_ オプションで hoge_ から始まるコンテナのみを取得
docker ps --quiet --all --filter name=hoge_ \
# xargs で標準入力で渡したコンテナID群を引数にして docker inspect に渡す
# --no-run-if-empty オプションでコンテナIDが空なら処理中止
| xargs --no-run-if-empty docker inspect \
# 先述の通り jq コマンドで整形して欲しい情報のみを表示
| jq ".[] | {id: .Id, created: .Created, startedAt: .State.StartedAt, finishedAt: .State.FinishedAt}"
# 短縮オプションを用いたワンライナー
docker ps -aq -f name=hoge_ | xargs -r docker inspect | jq ".[] | {id: .Id, created: .Created, startedAt: .State.StartedAt, finishedAt: .State.FinishedAt}"
またこれの応用として次の様に jq に渡す色々で絞り込みをを行うのも良いですし、単に inspect で止めて詳らかな JSON を元になんやかんやするのも良いです。
# --all オプションで実行中以外のコンテナも表示 # --quiet オプションでコンテナのIDのみを表示 # --filter name=hoge_ オプションで hoge_ から始まるコンテナのみを取得 # --filter status=xxxx オプションで実行完了済み、実行できていないコンテナのみを取得 docker ps --quiet --all \ --filter name=hoge_ \ --filter status=exited \ --filter status=dead \ --filter status=created \ # xargs で標準入力で渡したコンテナID群を引数にして docker inspect に渡す # --no-run-if-empty オプションでコンテナIDが空なら処理中止 | xargs --no-run-if-empty docker inspect \ # jq コマンドでログファイルのパスを列挙 | jq .[].LogPath
追記:自分がよく使う docker inspect、docker ps を例で用いましたが、それぞれの新コマンドであるdocker container inspect、docker container lsを用いても全然問題ありません。