Dockerコンテナの日付をエポックからミリ秒に変換する

Dockerコンテナの日付をエポックからミリ秒に変換する

長期実行Dockerコンテナを見つけようとしています。

最初の実行はdocker ps --format '{{.RunningFor}}'次のようなものを返します。

About a minute ago
11 minutes ago

これは加工に全く役に立たない。この設定を変更し、JSON出力に同じ値を持つ方法が見つかりません。

次に私はそれを試しましたdocker ps --format '{{.CreatedAt}}'。これは同様の値を返します2019-01-03 12:49:46 +0000 UTC

問題は、これがISO 8601や他の一般的な形式ではないことです。さらに悪いことは、次のようにdate解析してみてください。

date --date="$DATE"
date: invalid date ‘2019-01-03 12:49:46 +0000 UTC’

などを使用して値を手動で処理するのではなく、エポックミリ秒の値を取得するより良い方法があることを望んでいますが、見つかりませんawk。最良の点は{{epoch .CreatedAt}}(と同様{{lower .Name}})機能です。

答え1

docker inspect <container-name>コンテナに関する詳細情報が提供されます。

あなたは次の価値に興味があるかもしれません。状態、開始時間

 "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 1234,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2018-12-20T12:41:54.281709415Z",
            "FinishedAt": "2018-12-20T12:41:28.781748517Z"
        },

実行中のすべてのコンテナーを確認するには、以下を実行できます。

docker container ls --format="{{.Names}}" | xargs -n1 docker container inspect

JSON出力:持つジャッキーInstalled( apt-get install jq)、コンテナ名、および StartedAt だけをフィルタリングできます。

docker container ls --format="{{.Names}}" | xargs -n1 docker container inspect | jq '.[] | {name: .Name, uptime: .State.StartedAt}'

CSV出力:(セミコロンで区分、年齢別にソート)

docker container ls --format="{{.Names}}" | xargs -n1 docker container inspect --format='{{.Name}};{{.State.StartedAt}}' | sort -k2,1

編集する:

使用docker ps (生成時間=開始時間と仮定します。コンテナを停止して起動すると機能しません。docker psは人間が読める「5週間前」スタイルでのみ提供します。より安定してRunningFor得ることができます。Statusdocker inspect

docker ps --format="{{.CreatedAt}} {{.Names}}" | sort -k1,1

編集2:

goとdocker apiを使用すると、これをすべて行うことができることがわかりました。作成したばかりの簡単なデモは次のとおりです。

バイナリを取得できます協会:またはコードを必要に応じて変更して自分でコンパイルします。協会

結果は次のとおりです。

container_age for API v1.37
DURATION ID         NAME
50h      1234567890 /jenkins
362h     1234567891 /elasticsearch

答え2

誰かが役に立つ場合は、次のように私が作成したbashスクリプトがあります。Michael D.の回答

        before=$(date -d"$SINCE" +%s)

        while read -r id started
        do
          milis=$(date -d"$started" +%s)
          if (( before > milis ))
          then
            echo "$id"
          fi
        done < <(docker ps -a --format="{{.ID}}" | xargs -n1 docker container inspect --format='{{.ID}} {{.State.StartedAt}}') \
        | xargs docker rm -f -v

関連情報