[ Content contribution] 打包deb-自动导入docker镜像-自动创建容器
Tofloor
default avatar
酷谷的谷子
deepin
2024-05-20 03:24
Author

https://www.i8520.cn/

现在docker容器使用越来越频繁 所以做了一个 打包 docker 镜像 导入 这样一个模板

打包deb-自动导入docker镜像-自动创建容器

使用模板打包的 ollama 镜像 一键安装使用很方便 https://cloud.189.cn/t/zauQVbMN3yEf (访问码:rp3i)

前章:

bash shell https://bbs.deepin.org/zh/post/258659

安装 docker https://bbs.deepin.org/zh/post/258166

docker 使用总结 http://t.csdnimg.cn/b5Di6

lib目录脚本的使用说明 https://note.youdao.com/s/BBlPM7OJ

安装 7z

sudo apt-get update
sudo apt-get install p7zip-full

打包deb-自动导入docker镜像-自动创建容器

启动器运行流程

运行流程.png

这个要怎么实现呢,先看一下怎个项目的目录结构,可以看出主要使用功能是

cn.i8520.ubuntu2204/DEBIAN/postinst 脚本实现的

模板下载 cn.i8520.ubuntu2204.zip

打包deb-自带导入docker镜像-自动创建容器.png

注意事项:

注意事项.png

应用名称可以自己改,改了以后要修改以下文件

cn.i8520.ubuntu2204/DEBIAN/control Package: cn.i8520.ubuntu2204 cn.i8520.ubuntu2204改成你的应用名字 #------------------------------------ 以下文件需要修改变量的值 DebTemplate="cn.i8520.ubuntu2204" cn.i8520.ubuntu2204改成你的应用名字 cn.i8520.ubuntu2204/DEBIAN/postinst cn.i8520.ubuntu2204/DEBIAN/postrm cn.i8520.ubuntu2204/opt/CN-i8520-MILLET/cn.i8520.ubuntu2204/bin/cmd-link-ServersFile cn.i8520.ubuntu2204/opt/CN-i8520-MILLET/cn.i8520.ubuntu2204/bin/RUN

下面来拆分一下 postinst 脚本实现的代码

1.创建启动文件

自己准备图片放到 opt/CN-i8520-MILLET/cn.i8520.ubuntu2204/icon 里面

首先我们需要自动获取 /opt/CN-i8520-MILLET/cn.i8520.ubuntu2204/icon 里面的图标名字

可以写一个函数来获取,通过字符串拼接就可以实现

#获取图标文件名 DebTemplate="cn.i8520.ubuntu2204" IcomFileDir="/opt/CN-i8520-MILLET/${DebTemplate}/icon" IcomFileDirX(){ cd ${IcomFileDir} ls }

与DebTemplate="cn.i8520.ubuntu2204"的值作为desktop文件的名字,这个也不用管

#快捷方式/启动器名字 AppName="AppNam" #项目名字 DebTemplate="cn.i8520.ubuntu2204" #创建.desktop文件 DesktopFileDir="/opt/CN-i8520-MILLET/${DebTemplate}/DesktopStartupFile" ExecDIR="/opt/CN-i8520-MILLET/${DebTemplate}/bin/cmd-link-ServersFile" if [ ! -f "${DesktopFileDir}/${DebTemplate}.desktop" ] then cat > ${DesktopFileDir}/${DebTemplate}.desktop<<EOT #!/usr/bin/env xdg-open [Desktop Entry] Name=${AppName} Name[zh_CN]=${AppName} Comment=${AppName} Terminal=false Type=Application Categories=Graphics; StartupNotify=true Actions=Configure;Capture; Exec=${ExecDIR} Icon=${IcomFileDir}/`IcomFileDirX` EOT #附加执行权限 /opt/CN-i8520-MILLET/${DebTemplate}/lib/CCCX 755 ${DesktopFileDir}/${DebTemplate}.desktop /opt/CN-i8520-MILLET/${DebTemplate}/lib/CCCX ${DesktopFileDir}/${DebTemplate}.desktop #复制启动器文件到开始菜单和桌面 cp -r ${DesktopFileDir}/${DebTemplate}.desktop /usr/share/applications cp -r ${DesktopFileDir}/${DebTemplate}.desktop "${MY_Desktop}" fi

2.导入镜像

7z压缩包放倒opt/CN-i8520-MILLET/cn.i8520.ubuntu2204/DockerImage

首先需要自己准备tar镜像并且压缩成7z压缩包这样可以节省DEB安装包的体积

还是写函数来进行字符串的拼接

获取7z压缩包的名字

ImageDir=/opt/CN-i8520-MILLET/${DebTemplate}/DockerImage #获取7z文件名的函数 File7z(){ cd ${ImageDir} ls | grep ".7z" } #然后是解压7z 7z x "${ImageDir}/`File7z`" -o${ImageDir}

在来获取镜像名字并导入镜像

#获得镜像名字的函数 ImageFile(){ cd ${ImageDir} ls | grep ".tar" } #导入镜像,并且输出一个日志文件,为自动创建容器做准备 docker load -i "${ImageDir}/`ImageFile`" > /opt/CN-i8520-MILLET/${DebTemplate}/image.docker.load.log

我们把代码重解压7Z到导入镜像整合一下

#------------------------------- # 倒入镜像 #------------------------------- ImageDir=/opt/CN-i8520-MILLET/${DebTemplate}/DockerImage #获取7z文件名的函数 File7z(){ cd ${ImageDir} ls | grep ".7z" } #获得镜像名字的函数 ImageFile(){ cd ${ImageDir} ls | grep ".tar" } if [ -f "/opt/CN-i8520-MILLET/${DebTemplate}/image.docker.load.lock" ]; then echo "镜像已倒入" else echo "" > /opt/CN-i8520-MILLET/${DebTemplate}/image.docker.load.lock #解压镜像 7z x "${ImageDir}/`File7z`" -o${ImageDir} sleep 1 #倒入镜像 docker load -i "${ImageDir}/`ImageFile`" > /opt/CN-i8520-MILLET/${DebTemplate}/image.docker.load.log sleep 1 rm -rf "${ImageDir}/`ImageFile`" echo "镜像已倒入" fi

接下来就是创建容器

docker load -i "${ImageDir}/`ImageFile`" > /opt/CN-i8520-MILLET/${DebTemplate}/image.docker.load.log 这条命令会把导入镜像时最后一行回显写入 /opt/CN-i8520-MILLET/${DebTemplate}/image.docker.load.log 内容大概是这样的 三段 xxx image: ubuntu/22.04:naw 我们就要利用 ubuntu/22.04:naw 第三段 来创建容器 image_docker_load_log="/opt/CN-i8520-MILLET/${DebTemplate}/image.docker.load.log" cat ${image_docker_load_log} | grep "image:" | awk '{print $3}'

下面是具体代码:

注意事项:也就是根据你的镜像需求来写,这个是需要手动改的上面的都是自动实现是

#容器名字 ContainerName="AAAA" 定义的是容器的名字 在postinst脚本开头

#------------------------------- # 创建容器 #------------------------------- Docker_Image_RUN(){ if [ -f "/opt/CN-i8520-MILLET/${DebTemplate}/Docker_Image_RUN.lock" ]; then echo "创建容器 OK" else echo "" > /opt/CN-i8520-MILLET/${DebTemplate}/Docker_Image_RUN.lock image_docker_load_log="/opt/CN-i8520-MILLET/${DebTemplate}/image.docker.load.log" REPOSITORY_TAG=`cat ${image_docker_load_log} | grep "image:" | awk '{print $3}'` REPOSITORY_TAG_NAME="${REPOSITORY_TAG}" #开放的端口 PORT_A="-p 18598:18598 -p 18605:18605 -p 30002:30002 -p 30011:30011" #容器名字 CONTAINER_NAME="${ContainerName}" #映射路径 VOLUME_A="-v ${MY_USER_DIR}/data1:/data1" CMD_INI='/sbin/init' docker run -d --name ${CONTAINER_NAME} ${PORT_A} --privileged=true ${VOLUME_A} ${REPOSITORY_TAG_NAME} ${CMD_INI} fi } Docker_Image_RUN

接下来就是 postrm 脚本很简单 具体自己看一下就明白

#!/bin/bash DebTemplate="cn.i8520.ubuntu2204" NninstalDirShrll="/opt/CN-i8520-MILLET/uninstal/${DebTemplate}" #-------------------------- # 写一个善后函数 叫做 Delete files #------------------------- DeleteFiles(){ MY_USER_DIR=`${NninstalDirShrll}/MY-USER-PWD 1` MY_USER_NAME=`${NninstalDirShrll}/MY-USER-PWD` MY_Desktop=`${NninstalDirShrll}/MY-Desktop` rm -rf /opt/CN-i8520-MILLET/${DebTemplate} rm -rf ${NninstalDirShrll} rm -rf /usr/share/applications/${DebTemplate}.desktop rm -rf ${MY_Desktop}/${DebTemplate}.desktop #把你要善后删除的什么东西的代码写这里 } #-------------------------- # 执行部分 #------------------------ if [ -d "${NninstalDirShrll}" ]; then #执行善后的函数 DeleteFiles else echo "OK" fi exit 0

最后就是启动器文件,打开进入容器的一个流程

#容器名字 ContainerName="AAAA" #容器名字到保存到 ContainerName.TXT echo "${ContainerName}" > /opt/CN-i8520-MILLET/${DebTemplate}/ContainerName.TXT #------------------- #ContainerName.TXT 被以下下文件使用 # 作为终端窗口名字 opt/CN-i8520-MILLET/cn.i8520.ubuntu2204/bin/cmd-link-ServersFile # 作为容器名字来运行容器 opt/CN-i8520-MILLET/cn.i8520.ubuntu2204/bin/RUN
Reply Favorite View the author
All Replies
神末shenmo
deepin
Spark-App
Solutions Team Moderator
2024-05-20 03:29
#1

啧啧啧(摇头,称赞)

有点意思,先mark

用deb分发docker image的架构,似乎也不错

做到服务的傻瓜式部署

Reply View the author
neko
deepin
Ecological co-builder
Resources Team Moderator
2024-05-20 03:30
#2

有点类似ACE

Reply View the author
MDGA
deepin
2024-05-20 03:32
#3

妙啊

Reply View the author
baicailio
deepin
2024-05-20 03:37
#4

mark

Reply View the author
神末shenmo
deepin
Spark-App
Solutions Team Moderator
2024-05-20 03:39
#5
neko

有点类似ACE

和ACE的单包部署流程差不多

只是ACE部署是手搓的,这个直接用docker的基础设施

Reply View the author
出售星辰之书的书商
Moderator
2024-05-20 04:16
#6
感谢分享 applaud
Reply View the author
酷谷的谷子
deepin
2024-05-20 04:44
#7
神末shenmo

啧啧啧(摇头,称赞)

有点意思,先mark

用deb分发docker image的架构,似乎也不错

做到服务的傻瓜式部署

就是为了方便使用docker 镜像弄的,适合一些docker服务类,web应用

直接安装就可以

就是不太适合乌班图,乌班图的桌面启动器文件权限有点奇怪就是用不了

Reply View the author
兆兆嘟嘟嘟
deepin
2024-05-20 05:12
#8

感谢分享。

Reply View the author
乾豫恒益
deepin
2024-05-20 06:24
#9

先收藏了,认真学习。。。

Reply View the author