我们之前已经基本了解了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
失效,所以临时策略是 将命令输出到文件,然后再从文件读取命令并且执行。
这些东西看着简单,但是当实际操作的时候,就会出现很多问题,这恰恰锻炼了我,我也希望在工作和生活中,永远保持空杯心态,遇到不会的学习之,遇到会的巩固之。