podman REST API 的images操作
一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情。
我们之前已经基本了解了podman api的组成,我总结一下,大概可以区分为2类
第一类是兼容 docker api的,主要由2类路由
/v3.4.4/containers/create
containers/create
第二类便是podman自己提供的,区别于docker api的
例如
/v3.4.4/libpod/container/create
如果你还未尝试使用过任何一种api,那么随便选择一个都可以
之前已经看过一些列流程操作,从拉取镜像,到启动容器,再到删除镜像,这次我们来详细看看images的操作
前提: 已经启动podman api服务,其中遇到的命令参数再做解释
images API 操作
查看images
请求路由: 版本号/libpod/images/json
请求方式: GET
在使用podman api查看images的时候,我们不仅可以查询所有的出来,而且还可以搜索相应的数据,例如: label、id等
使用podman cli查看images
命令: podman images
使用podman api查看images
命令: curl -s -X GET http://127.0.0.1:8881/v3.4.4/libpod/images/json | jq
-s: Silent模式,不输出任何东西
使用podman参数信息
例如,我们只想返回docker.io/library/nginx:latest这个容器列表(额,,虽然说毫无暖用,但是我们可以看下curl对于map[string][]string的语法是怎样的,后面使用label的信息去抓取才能得心应手)
命令: curl -sG -X GET "http://127.0.0.1:8881/v3.4.4/libpod/images/json" --data-urlencode 'filters={"since":["docker.io/library/nginx:latest"]}' | jq
-s:Silent模式,不输出任何东西-X: 指定该请求方式,例如:GET、POST、DELETE等-G: 使用http GET发送请求数据since: 是podman api``filters定义的参数之一,镜像名称,可以为ID、imagesname:tag、images@tag
list images会列出podman images,当镜像过多的时候,尽量使用filters去做赛选,不要将全部数据全部请求回服务器,然后由服务器做赛选,那样得不偿失。
搜索images
请求方式: GET
请求URL: 版本/libpod/images/search
使用podman搜索images
使用podman搜索官方发布的nginx
使用命令行搜索nginx且未官方发布的
命令: curl -G --data-urlencode 'filters={"is-official":["true"]}' '127.0.0.1:8881/v3.4.4/libpod/images/search?term=nginx' | jq
is-official: 在搜索镜像中,该参数为bool值,用于检索是否是官方发布的镜像term: 搜索的容器关键词
命令含义: 搜索nginx镜像且未官方发布的
拉取镜像
请求方式: POST
请求路由: 版本号/libpod/images/pull
使用podman api拉取镜像
拉取一下redis容器
命令: curl -X POST http://127.0.0.1:8881/v3.4.4/libpod/images/pull?reference=docker.io/library/redis:latest&quiet=true&policy=newer
命令含义
reference: 指定镜像名称quiet: 静默输出(层数pull省略了)policy: 拉取规则 always(总是)、newer(更新时)、never(从不)、missing(没有的时候)credentials: 认证,(username:password)tlsVerify: 是否使用TLS验证,默认true,私有库很多是没有做加密的,所以一般在拉取私有库镜像的时候,应当使用false
删除未使用的镜像
请求方式: POST
请求路由: 版本号/libpod/images/prune
使用podman api删除未使用的镜像
命令: curl -X POST http://127.0.0.1:8881/v3.4.4/libpod/images/prune?all=true
all:true: 删除全部未使用的镜像
删除容器
请求方式: DELETE
请求路由: 版本号/libpod/images/remove
删除容器,不仅可以想我们之前讲过的那样,删除未使用的镜像,还可以删除正常使用的镜像(启动该镜像的容器就会被停掉且删除掉)
我们看看具体操作呢
使用podman api强制删除镜像
删除命令: curl -X DELETE http://127.0.0.1:8881/v3.4.4/libpod/images/remove?images=docker.io/library/nginx&force=true
images: 指定要删除的容器force: 强制删除(并且删除正在运行的容器)
导出镜像
请求方式: GET
请求路由: 版本号/libpod/images/镜像名称或ID/get
使用podman api也能导出镜像来,不过这玩意比较鸡肋
我们来尝试一下
查看镜像
使用podman api导入镜像
我们将使用podman api将redis导出至本地
命令: curl -X GET http://127.0.0.1:8881/v3.4.4/libpod/images/bba24acba395/get?compress=true -o redis.tar.gz
-o: 是curl命令重定向到文件compress: 压缩
完善shell脚本
我们一般使用的images的操作为 搜索镜像、拉取镜像、查看镜像、清理未建立容器的镜像 以及 删除镜像 ,好的,我们完善下podman api shell小脚本
这里就展示核心代码以及代码成功了哈
掘金文章包含的代码案例在gitee上: gitee.com/pdudo/podma…
删除未被使用的镜像
核心代码
代码执行
搜索容器
代码
执行代码
问题与解决
- 导出镜像在使用
podman import导入的时候,没有问题,在使用podman api导入镜像的时候出问题了,该问题应该是curl的问题,我找了一下,都没找到好的解决方案
linux shell执行命令失败
传统命令: curl -sG http://127.0.0.1:8881/v3.0.0/libpod/images/search?term=redis&limits=3&noTrunc=true --data-urlencode 'filters={"is-official":["true"],"is-automated":["false"],"stars":["100"]}'
脚本中执行的命令: curl -sG 'http://127.0.0.1:8881/v3.0.0/libpod/images/search?term=redis&limits=3&noTrunc=true' --data-urlencode ''''filters={"is-official":["true"],"is-automated":["false"],"stars":["100"]}''''
该命令会导致filters失效,所以临时策略是 将命令输出到文件,然后再从文件读取命令并且执行。
这些东西看着简单,但是当实际操作的时候,就会出现很多问题,这恰恰锻炼了我,我也希望在工作和生活中,永远保持空杯心态,遇到不会的学习之,遇到会的巩固之。

浙公网安备 33010602011771号