因为在Docker上下载的一些镜像,创建了容器(Web服务)后经常会有更新,本来是每周自己手动更新下,后面突然想起,不是可以写个脚本自动更新就好了么。
于是,就有了这篇笔记。
定时任务还是用的crontab,前面有笔记写过用法了:Linux 定时执行 python脚本
1.创建脚本和配置文件
1).创建 cron_scripts 目录
创建 cron_scripts 目录放在home目录下,并且给权限,执行以下命令:
1 2
| mkdir cron_scripts chmod 755 cron_scripts
|
2).创建 update_docker_images.sh 脚本文件
把需要自动执行的命令都放在这个脚本文件中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| #!/bin/bash
# 配置文件,每行格式: 容器名|镜像名|运行新容器的完整命令 CONFIG_FILE="${1:-$(dirname "$0")/docker_containers.conf}"
# 检查配置文件是否存在 if [ ! -f "$CONFIG_FILE" ]; then echo "配置文件 $CONFIG_FILE 不存在,创建示例配置..." cat > "$CONFIG_FILE" << EOF # 格式: 容器名|镜像名|运行新容器的完整命令 deep-research-web|anotia/deep-research-web:latest|docker run --restart=always -p 3000:3000 --name "deep-research-web" -d "anotia/deep-research-web:latest" # 示例: container2|image2:tag|docker run --restart=always -p 8080:80 --env VAR=value --volume /host:/container --name "container2" -d "image2:tag" EOF echo "已创建示例配置文件 $CONFIG_FILE,请编辑后重新运行脚本" exit 1 fi
# 读取配置文件并处理每个容器 while IFS='|' read -r CONTAINER_NAME IMAGE_NAME RUN_COMMAND || [ -n "$CONTAINER_NAME" ]; do # 跳过注释行和空行 [[ "$CONTAINER_NAME" =~ ^#.*$ || -z "$CONTAINER_NAME" ]] && continue echo "===== 处理容器: $CONTAINER_NAME =====" # 停止并删除旧容器 if docker ps -aq --filter name="$CONTAINER_NAME" | grep -q . ; then echo "停止并删除旧容器 $CONTAINER_NAME..." docker stop "$CONTAINER_NAME" 2>/dev/null # 忽略错误 (如果容器不存在) docker rm "$CONTAINER_NAME" 2>/dev/null # 忽略错误 fi
# 删除旧镜像 (可选,但建议) if docker images -q "$IMAGE_NAME" | grep -q . ; then echo "删除旧镜像 $IMAGE_NAME..." docker rmi "$IMAGE_NAME" 2>/dev/null # 忽略错误 fi
# 拉取最新镜像 echo "拉取最新镜像 $IMAGE_NAME..." docker pull "$IMAGE_NAME"
# 运行新容器 echo "运行新容器 $CONTAINER_NAME..." echo "执行: $RUN_COMMAND" eval $RUN_COMMAND
echo "容器 $CONTAINER_NAME 更新成功" echo "" done < "$CONFIG_FILE"
echo "所有 Docker 镜像和容器更新完成"
|
3).创建 docker_containers.conf 配置文件
把所有需要自动更新的Docker的容器(镜像)都放在这个配置文件中
1 2 3 4 5 6
| # 格式: 容器名|镜像名|运行新容器的完整命令 deep-research-web|anotia/deep-research-web:latest|docker run --restart=always -p 3000:3000 --name "deep-research-web" -d "anotia/deep-research-web:latest" # 示例: 添加更多容器,每行一个 # nginx-proxy|nginx:latest|docker run --restart=always -p 80:80 --volume /path/to/html:/usr/share/nginx/html --name "nginx-proxy" -d "nginx:latest" # postgres-db|postgres:14|docker run --restart=always -p 5432:5432 --env POSTGRES_PASSWORD=secret --volume /data/postgres:/var/lib/postgresql/data --name "postgres-db" -d "postgres:14" lobe-chat|lobehub/lobe-chat:latest|docker run --restart=always -p 3210:3210 --name "lobe-chat" -d "lobehub/lobe-chat:latest"
|
2.给 update_docker_images.sh 添加可执行权限
1
| chmod +x cron_scripts/update_docker_images.sh
|
3.设置 crontab 定时任务
crontab 具体用法看这里:Linux 定时执行 python脚本
在里面执行的脚本写绝对路径。
1 2
| crontab -e 0 4 * * 6 /home/ubuntu/cron_scripts/update_docker_images.sh >> /home/ubuntu/cron_scripts/update_docker_images.log 2>&1
|
0 4 * * 6:表示每周六早上 4 点执行。
4.重启cron服务
1
| sudo service cron restart
|
5.验证定时任务是否成功
1 2 3 4 5
| crontab -l
~/cron_scripts/update_docker_images.sh
|