51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

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

前章: {#%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}

​​启动器运行流程

6d8036e94df8ff52d463df931d8bac8d.png

这个要怎么实现呢,先看一下这个项目的目录结构,可以看出主要使用功能是,cn.i8520.ubuntu2204/DEBIAN/postinst 脚本实现的

附件下载

202405200323152081_cn.i8520.ubuntu2204.zip

ceddc502ce20c4eef67ee0c52ad760cd.png

注意事项:

7cc6f3133171df84c8a91818fa6e512c (3).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/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

6d8036e94df8ff52d463df931d8bac8d.png




赞(0)
未经允许不得转载:工具盒子 » 打包deb-自动导入docker镜像-自动创建容器