默认使用host网络,重启规则非手动停止$pam
环境变量、挂载路径等参数,$name
容器名,$imageName
镜像名版本
docker run -d --network=host --restart=unless-stopped $pam --name=$name $imageName
Lobe-Chat示例,环境变量从文件中取
LIST=()
# 创建函数并添加到 LIST 数组
# name,imageName,pam
LIST+=("Lobe-Chat,lobehub/lobe-chat:latest,--env-file /mnt/sda1/docker/update/lobechat.env")
青龙示例
LIST+=("qinglong,whyour/qinglong:latest,-v /mnt/sda1/Configs/ql:/ql/data -v /mnt/sda1/Configs/ql/ninja:/ql/data/ninja -e ENABLE_HANGUP=true -e ENABLE_WEB_PANEL=true -e ENABLE_TG_BOT=true")
小雅示例
LIST+=("xiaoya,xiaoyaliu/alist:hostmode,-v /mnt/sda1/Configs/xiaoya:/data")
homeassistant示例
LIST+=("homeassistant,homeassistant/home-assistant:latest,-v /mnt/sda1/Configs/HomeAssistant:/config -e TZ=Asia/Shanghai")
自动更新脚本(TODO:删除旧镜像无法输出镜像信息)
#!/bin/bash
# auto-update.sh
LIST=()
# 创建函数并添加到 LIST 数组
# name,imageName,pam
#LIST+=("Lobe-Chat,lobehub/lobe-chat:latest,--env-file /mnt/sda1/docker/update/lobechat.env")
#青龙更新后需要重新安装依赖
LIST+=("qinglong,whyour/qinglong:latest,-v /mnt/sda1/Configs/ql:/ql/data -v /mnt/sda1/Configs/ql/ninja:/ql/data/ninja -e ENABLE_HANGUP=true -e ENABLE_WEB_PANEL=true -e ENABLE_TG_BOT=true")
#LIST+=("xiaoya,xiaoyaliu/alist:hostmode,-v /mnt/sda1/Configs/xiaoya:/data")
LIST+=("homeassistant,homeassistant/home-assistant:latest,-v /mnt/sda1/Configs/HomeAssistant:/config -e TZ=Asia/Shanghai")
LIST+=("rabbitpro,ht944/rabbitpro:latest,-v /mnt/sda1/Configs/rabbitpro:/Rabbit/data")
LIST+=("sub-store,xream/sub-store:latest,-v /mnt/sda1/Configs/sub-store:/opt/app/data -e TZ=Asia/Shanghai -e SUB_STORE_FRONTEND_BACKEND_PATH=/admin")
#LIST+=("nodered,nodered/node-red:latest,-v /mnt/sda1/Configs/node-red:/data -e TZ=Asia/Shanghai")
# 获取当前日期并格式化
formatted_date=$(date +"%Y-%m-%d %H:%M:%S")
echo "[$formatted_date]开始执行任务,任务个数:${#LIST[@]}"
for info in "${LIST[@]}"; do
IFS=',' read -r -a params <<<"$info"
name="${params[0]}"
imageName="${params[1]}"
pam="${params[2]}"
echo "[$formatted_date]开始拉取${imageName}最新的镜像..."
# 拉取最新的镜像并将输出存储在变量中
output=$(docker pull $imageName 2>&1)
# 检查拉取命令是否成功执行
if [ $? -ne 0 ]; then
echo "拉取失败: $output" >&2 # 输出错误信息到标准错误
continue
fi
if [ $(docker container ls -a --filter "name=$name" | wc -l) -gt 1 ]; then
# 检查输出中是否包含特定的字符串
echo "$output" | grep -q "Image is up to date for $imageName"
# 如果镜像已经是最新的,则不执行任何操作
if [ $? -eq 0 ]; then
echo "${imageName}镜像已经是最新的,无需更新."
continue
fi
echo "开始${name}更新..."
# 删除旧的容器
echo "删除旧的容器: $(docker rm -f $name)"
else
echo "${name}容器不存在,开始创建..."
fi
# 运行新的容器
echo "运行新的容器: $(docker run -d --network=host --restart=unless-stopped $pam --name=$name $imageName)"
IFS=':' read -r -a array <<<"$imageName"
# 清理不再使用的镜像
images=$(docker images | grep ${array[0]} | grep -v ${array[1]} | awk '{print $3}')
image_name="删除旧的镜像:"
for image_id in $images; do
image_name+=$(docker inspect --format='{{.RepoTags}}' "$image_id")
docker rmi "$image_id" >/dev/null 2>&1
done
echo "$image_name"
# 获取当前日期并格式化
formatted_date=$(date +"%Y-%m-%d %H:%M:%S")
# 打印更新的时间和版本
echo "[$formatted_date]执行完成,当前镜像版本: $(docker inspect $imageName | grep 'org.opencontainers.image.version' | awk -F'"' '{print $4}')"
done