昨天我们对 拉取镜像、创建容器、启动容器 、列出容器、停止容器、删除容器、删除镜像 ,今天我们来封装到shell
小工具中,关于掘金文章所提及的shell
部分,我也放在了gitee
上面: gitee.com/pdudo/podma…
接上一篇
问题描述
上一章,我们模拟创建容器,使用socket
和tcp
得到的结果不一样,晚上的时候,我仔细对比了一下,找到问题了,是我参数写错了。
我昨天请求的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
,url
为 libpod/images/镜像名称
我们来尝试一下
我们还是和上面一样,把删除镜像的架子搭建好
配置脚本中增加 declare -r DELIMAGES="images"
main.sh
脚本中新增 删除参数为6
且调用函数 delImages
删除镜像函数
测试删除镜像函数
总结
今天对于学习podman
而言干了2件事情
- 确认了
Podman api
2种调用方式
其一为 兼容docker
调用的 ,其二为 podman
专门调用的,通过看源码,我们可以发现其实podman api
对我们请求的版本要求没有限制,只要以v
开头即可
shell
小工具继续完善
其二为 shell
小工具加入了镜像拉取 和 镜像删除 的方法,通过上面的脚本,我们可印证之前的结论,那就是shell
核心语句其实就那么一两句,但是为了脚本的健壮性,我们需要写大量的语句来“辅助”它执行