针对podman REST API 的shell调用-2

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情

昨天我们对 拉取镜像创建容器启动容器列出容器停止容器删除容器删除镜像 ,今天我们来封装到shell小工具中,关于掘金文章所提及的shell部分,我也放在了gitee上面: gitee.com/pdudo/podma…

接上一篇

问题描述

上一章,我们模拟创建容器,使用sockettcp得到的结果不一样,晚上的时候,我仔细对比了一下,找到问题了,是我参数写错了。

我昨天请求的url

curl -X POST -H 'Content-Type: application/json' -d @postFiles.json http://127.0.0.1:8881/v3.0.0/libpod/containers/create

实际上我们应该请求的url

curl -X POST -H 'Content-Type: application/json' -d @postFiles.json http://127.0.0.1:8881/v3.0.0/containers/create

这。。。我是比较诧异的,为啥v3.0.0/libpod/containers/create不报错。。。

我甚至怀疑到了是我podman 版本问题,昨天差点就搞虚拟机装centos 8,准备尝试下podman 4.0了。哎,总之,找到了问题就好,这个问题耽搁了好久,好,既然找到了问题,那么我们看看,到底是为啥子呢?

追根溯源

这个,恐怕得找源码了,我们找找看

由于有路由信息,所以很好找,一下子就找到了

podman git地址: github.com/containers/…

我把调用的东西给单独摘出来

libpod/container/create

container/create

额,看了一下,感情,前面版本号加不加都可以呀,2个路由都指向一个函数,一个是前面有版本号的,我们写的v3.0.0 尝试了一下,果然如此。。。

VersionedPath函数

问题确认

我们将上述路由信息抽象出来大概是这样的

r.HandleFunc(VersionedPath("/libpod/containers/create"),s.APIHandler(libpod.CreateContainer)).Methods(http.*MethodPost*)

r.HandleFunc(VersionedPath("/containers/create"),s.APIHandler(compat.CreateContainer)).Methods(http.*MethodPost*)

发现,是调用的函数不一样

我们使用/libpod/containers/create调用的是libpod.CreateContainer

我们使用/containers/create调用的是 compat.CreateContainer

我们目前猜测,/libpod/containers/create读取不到配置,应该是我们json写错了

那问题点就是这2个参数引起的,我们再看

我们查看路由读取json文件的详细结构体

我们根据上述找到的路由信息,点点路径找找看

/containers/create

/libpod/containers/create

验证猜想

可以看到,libpod/containers/create使用的是portmappings来规划对应端口的

我们修改一下json文件格式

修改后如下

再次尝试利用podman api新建容器

问题结论

额。。。 发现可以了,总结一下2个接口,理清了过后,再反过来看,大概是这样的

podman为了兼容docker

所以路由信息为VersionedPath("/containers/create")或者/containers/create,当然你可以去看docker api然后使用如上2个接口中的其中一个进行调用

然后podman自己也搞了一个独立的api接口,那便是 VersionedPath("/libpod/containers/create"),它所使用的的json数据文件是不兼容docker的,然后现在比较纠结的是,podman api使用的人还是太少了,找东西好难呀,所以我们写shell小工具的时候,还是以兼容docker为准。

shell小工具完善

由于创建容器过于复杂,本次shell小工具不会包含启动容器相关,后面会单独列一期来讲述容器创建相关

镜像拉取

我们先确保镜像为空

拉取镜像路由为: /v3.0.0/libpod/images/pull?reference=镜像名称,所以我们根据该命令写出镜像拉取脚本

完善env配置文件

我们新增 declare -r PULLIMAGES="images/pull?reference="

我们修改main函数,新增拉取镜像操作

新增帮助项 5.拉取镜像

新增case函数信息

5) pullImages

好了,框架新增完毕,我们开始来写pullImages函数

尝试使用脚本安装镜像

删除镜像

我们删除容器使用的协议为 DELETE ,urllibpod/images/镜像名称

我们来尝试一下

我们还是和上面一样,把删除镜像的架子搭建好

配置脚本中增加 declare -r DELIMAGES="images"

main.sh脚本中新增 删除参数为6 且调用函数 delImages

删除镜像函数

测试删除镜像函数

总结

今天对于学习podman而言干了2件事情

  • 确认了Podman api2种调用方式

其一为 兼容docker调用的 ,其二为 podman专门调用的,通过看源码,我们可以发现其实podman api对我们请求的版本要求没有限制,只要以v开头即可

  • shell小工具继续完善

其二为 shell小工具加入了镜像拉取 和 镜像删除 的方法,通过上面的脚本,我们可印证之前的结论,那就是shell核心语句其实就那么一两句,但是为了脚本的健壮性,我们需要写大量的语句来“辅助”它执行

猜你喜欢

转载自juejin.im/post/7086761085843275807