将 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’

我希望必须有一种更好的方法来获取纪元毫秒值,而不是使用awketc 手动处理该值,但我找不到它。最好的事情是像{{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

相关内容