我正在尝试寻找长期运行的 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
etc 手动处理该值,但我找不到它。最好的事情是像{{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 输出: 具有杰奇已安装 ( 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 只给出RunningFor
和,两者都以人类可读的“5周前”风格。使用方法来获取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 脚本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