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

前章:

bash shell 写shell bash 脚本的心得总结- Community - Deepin Technology

安装 docker distrobox+docker+ubuntu:20.04 配置宝塔面板- Community - Deepin Technology

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

lib目录脚本的使用说明 有道云笔记

安装 7z

sudo apt-get update

sudo apt-get install p7zip-full

使用模板打包的 ollama 镜像 一键安装使用很方便 天翼云盘 珍藏美好生活 家庭云|网盘|文件备份|资源分享 (访问码:rp3i)


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

启动器运行流程

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

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

附件在这里下载,就不上传在这里要积分 打包deb-自动导入docker镜像-自动创建容器- Community - Deepin Technology

 

 注意事项:

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

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

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值