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

现在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<

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
2024-05-20 11:29
#1

啧啧啧(摇头,称赞)

有点意思,先mark

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

做到服务的傻瓜式部署

Reply View the author
neko
deepin
Ecological co-builder
2024-05-20 11:30
#2

有点类似ACE

Reply View the author
好聚好散
deepin
2024-05-20 11:32
#3

妙啊

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

mark

Reply View the author
神末shenmo
deepin
Spark-App
2024-05-20 11:39
#5
neko

有点类似ACE

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

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

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

啧啧啧(摇头,称赞)

有点意思,先mark

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

做到服务的傻瓜式部署

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

直接安装就可以

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

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

感谢分享。

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

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

Reply View the author