如何用skopeo inspect查询Harbor中Docker镜像的拉取时间?
关于获取Docker镜像拉取时间的说明
首先要明确:Docker镜像的元数据(无论是远程仓库还是本地镜像)本身并不包含「拉取时间」字段——created字段是镜像构建完成的时间,而拉取时间属于本地操作记录或仓库的访问统计数据,不属于镜像本身的属性。
一、用Skopeo无法直接获取拉取时间的原因
Skopeo的inspect命令只能获取镜像本身的元数据(包括构建时间、作者、架构等),这些数据是镜像被推送到仓库时就固定下来的,和拉取操作无关,所以自然没有pulled字段。
二、获取拉取时间的可行方案
根据你的需求场景,分两种情况处理:
1. 记录自己本地拉取镜像的时间
如果你需要记录自己执行拉取操作的时间,最简单的方式是在执行Skopeo拉取命令时,同时记录当前系统时间:
# 记录拉取开始时间 pull_start_time=$(date +"%Y-%m-%d %H:%M:%S") # 执行拉取操作 skopeo copy docker://${image_path}:${tag} docker-daemon:${image_path}:${tag} --tls-verify=false # 记录拉取结束时间(可选) pull_end_time=$(date +"%Y-%m-%d %H:%M:%S") # 保存到日志文件 echo "镜像 ${image_path}:${tag} 拉取时间:开始于 ${pull_start_time},结束于 ${pull_end_time}" >> image_pull_logs.txt
如果你已经拉取过镜像到本地,想回溯拉取时间,可以查看本地Docker存储目录下的文件修改时间(路径可能因存储驱动不同而变化,以overlay2为例):
# 先获取本地镜像的ID image_id=$(docker inspect --format="{{.ID}}" ${image_path}:${tag}) # 查看镜像元数据文件的修改时间(近似拉取时间) ls -l /var/lib/docker/image/overlay2/imagedb/content/sha256/${image_id#sha256:}
2. 获取远程仓库中镜像的被拉取时间(仅部分私有仓库支持)
标准的Docker Registry v2 API并没有提供镜像拉取时间的查询接口,公共仓库(如Docker Hub)也不会暴露这类统计数据。但部分私有仓库(如Harbor)提供了扩展API,可以查询镜像的下载记录:
- 以Harbor为例,可通过其API查询镜像的下载日志,从中提取拉取时间(具体API需参考Harbor官方文档,这里仅作示例):
curl -u "username:password" -k https://${harbor_host}/api/v2.0/projects/${project_name}/repositories/${repo_name}/artifacts/${tag}/access_logs
返回结果中会包含每次拉取的时间戳信息。
三、用Curl查询的局限
用Curl调用Docker Registry的标准API,只能获取镜像的manifest或config元数据,这些内容里同样只有created字段,没有拉取时间相关信息,示例命令如下:
# 获取镜像的manifest(包含镜像层信息) curl -k -H "Accept: application/vnd.docker.distribution.manifest.v2+json" https://${registry_host}/v2/${image_path}/manifests/${tag} # 获取镜像的config(包含构建时间等元数据) # 先从manifest中提取config的digest config_digest=$(curl -s -k -H "Accept: application/vnd.docker.distribution.manifest.v2+json" https://${registry_host}/v2/${image_path}/manifests/${tag} | jq -r '.config.digest') # 再获取config内容 curl -k -H "Accept: application/vnd.docker.container.image.v1+json" https://${registry_host}/v2/${image_path}/blobs/${config_digest}
内容的提问来源于stack exchange,提问作者finalha
相关产品推荐
相关产品推荐

