针对podman REST API 的shell调用-2

简介: 针对podman REST API 的shell调用-2

昨天我们对 拉取镜像创建容器启动容器列出容器停止容器删除容器删除镜像 ,今天我们来封装到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


image.png


container/create

image.png



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

image.png


VersionedPath函数

image.png


问题确认


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

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

image.png

image.png


image.png


image.png


/libpod/containers/create

image.png

image.png

image.png

image.png




验证猜想


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

我们修改一下json文件格式

修改后如下

image.png


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


image.png



问题结论


额。。。 发现可以了,总结一下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小工具不会包含启动容器相关,后面会单独列一期来讲述容器创建相关


镜像拉取

我们先确保镜像为空

image.png


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

完善env配置文件

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

image.png


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

新增帮助项 5.拉取镜像


image.png


新增case函数信息

5) pullImages

image.png


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

image.png



尝试使用脚本安装镜像

image.png



删除镜像


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


我们来尝试一下

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

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

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


删除镜像函数

image.png


测试删除镜像函数

image.png





总结


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


  • 确认了Podman api2种调用方式

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


  • shell小工具继续完善

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


相关文章
|
1月前
|
缓存 API 网络架构
掌握现代API开发:GraphQL vs REST
【10月更文挑战第24天】本文深入探讨了现代API开发中两种主流技术——GraphQL和REST的设计理念、技术特点及实际开发中的对比分析。GraphQL通过声明式数据请求和强类型系统提供更高的灵活性和性能,而REST则以其无状态特性和成熟的生态系统见长。文章还讨论了两者在客户端-服务器交互、安全性和工具支持方面的优劣,帮助开发者根据项目需求做出明智选择。
|
3月前
|
JSON 中间件 API
开发REST API3-11
开发REST API3-11
|
3月前
|
JSON JavaScript API
编写REST API
编写REST API
66 2
|
2月前
|
Java API Maven
使用 Smart-doc 记录 Spring REST API
使用 Smart-doc 记录 Spring REST API
61 0
|
4月前
|
XML 安全 API
REST 和 SOAP API 有什么区别?
【8月更文挑战第31天】
249 0
|
5月前
|
JSON API 网络架构
gRPC 与 REST 的比较分析:哪种 API 适合您的开发需求?
gRPC, 由 Google 推出的开源远程过程调用(RPC)框架, 使两个应用程序间的方法调用变得简单,支持结构化数据的交换。通过采用 Protocol Buffers (Protobuf) ——一种与语言无关的接口定义语言,gRPC 体现了许多现代网络通信技术的优势
gRPC 与 REST 的比较分析:哪种 API 适合您的开发需求?
|
5月前
|
开发框架 Java API
Java中的REST API开发详解
Java中的REST API开发详解
|
5月前
|
开发框架 Java API
Java中的REST API开发详解
Java中的REST API开发详解
|
XML 安全 API
Rest API 开发分享
Rest API 开发分享
|
Prometheus 安全 JavaScript
一种不错的 BFF Microservice GraphQL/REST API 层的开发方式
一种不错的 BFF Microservice GraphQL/REST API 层的开发方式
355 0
一种不错的 BFF Microservice GraphQL/REST API 层的开发方式