前章: {#%E5%89%8D%E7%AB%A0%EF%BC%9A}
写shell bash 脚本的心得总结
https://bbs.deepin.org/zh/post/258659
distrobox+docker+ubuntu:20.04 配置宝塔面板
https://bbs.deepin.org/zh/post/258166
lib目录脚本的使用说明
https://note.youdao.com/s/BBlPM7OJ
#安装 7z
sudo apt-get update
`sudo apt-get install p7zip-full`
打包deb-自动导入docker镜像-自动创建容器 {#%E6%89%93%E5%8C%85deb-%E8%87%AA%E5%8A%A8%E5%AF%BC%E5%85%A5docker%E9%95%9C%E5%83%8F-%E8%87%AA%E5%8A%A8%E5%88%9B%E5%BB%BA%E5%AE%B9%E5%99%A8}
启动器运行流程
这个要怎么实现呢,先看一下这个项目的目录结构,可以看出主要使用功能是,cn.i8520.ubuntu2204/DEBIAN/postinst 脚本实现的
附件下载
202405200323152081_cn.i8520.ubuntu2204.zip
注意事项:
应用名称可以自己改,改了以后要修改一下文件
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/R
下面来拆分一下 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