장기 실행 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
으로 얻을 수 있습니다. 시간).Status
docker 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