Administrator
Published on 2024-06-06 / 44 Visits
0

Docker容器安装模板

默认使用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