도커 컨테이너 날짜를 에포크 이후 밀리초로 변환

도커 컨테이너 날짜를 에포크 이후 밀리초로 변환

장기 실행 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 스크립트가 있습니다.마이클 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

관련 정보