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的时候,我们不仅可以查询所有的出来,而且还可以搜索相应的数据,例如: labelid

使用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: 指定该请求方式,例如: GETPOSTDELETE
  • -G: 使用http GET发送请求数据
  • since: 是podman api``filters定义的参数之一,镜像名称,可以为IDimagesname:tagimages@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 apiredis导出至本地

命令: 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…

删除未被使用的镜像

核心代码

代码执行

搜索容器

代码

执行代码

问题与解决

  1. 导出镜像在使用podman import导入的时候,没有问题,在使用podman api导入镜像的时候出问题了,该问题应该是curl的问题,我找了一下,都没找到好的解决方案

  1. 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失效,所以临时策略是 将命令输出到文件,然后再从文件读取命令并且执行。

这些东西看着简单,但是当实际操作的时候,就会出现很多问题,这恰恰锻炼了我,我也希望在工作和生活中,永远保持空杯心态,遇到不会的学习之,遇到会的巩固之。

posted @ 2022-04-18 22:48  pdudos  阅读(0)  评论(0)    收藏  举报  来源