【Docker】コンテナの最終実行日時を細かい日時形式で取得する

  • 2022年3月22日
  • 2022年3月23日
  • Docker

 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 inspectdocker ps を例で用いましたが、それぞれの新コマンドであるdocker container inspectdocker container lsを用いても全然問題ありません。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG