为多个 Docker Compose 项目编写自动更新脚本

9次阅读
没有评论

在日常运维中,我们经常会遇到这样的需求:
服务器上运行着多个基于 Docker Compose 的服务(例如 WordPress、Nginx Proxy Manager、Redis、监控程序等),希望这些服务每天自动更新镜像,并自动重建容器,以保持环境最新与安全。

本文将教你如何编写一个 自动更新多个 docker-compose 项目 的 Shell 脚本,并设置每日定时任务自动运行。

最终实现效果:
• ✔ 对所有 compose 项目自动执行 docker-compose pull
• ✔ 自动 docker-compose up -d
• ✔ 自动记录日志
• ✔ 每天凌晨 4 点定时执行
• ✔ 一次性适配多个运行目录

一、目录结构示例

我服务器上的 docker 目录结构如下:
/root
├── data
│   └── docker_data
│       └── nodeseek
│           ├── data
│           └── docker-compose.yml
├── komari
│   ├── data
│   └── docker-compose.yml
├── npm
│   ├── data
│   ├── docker-compose.yml
│   └── letsencrypt
└── wordpress
        ├── db_data
        ├── docker-compose.yml
        ├── redis_data
        ├── uploads.ini
        └── wp_content

每个项目目录下都包含一个 docker-compose.yml,我们希望用一个脚本一次性更新所有项目。

二、创建自动更新脚本

创建:
vi /root/update_all_compose.sh
写入以下内容(已根据实际路径填写):
#!/bin/bash

##########################################################
# 多个 docker-compose 项目自动更新脚本(已适配 /root 路径)
##########################################################

# 定义 compose 文件路径(全部已修正为 /root/...)
compose_files=(
        "/root/data/docker_data/nodeseek/docker-compose.yml"   # NodeSeek RSS 服务
        "/root/komari/docker-compose.yml"                      # Komari monitor
        "/root/npm/docker-compose.yml"                         # Nginx Proxy Manager
        "/root/wordpress/docker-compose.yml"                   # WordPress + Redis + MySQL
)

# 日志文件
log_file="/root/docker_auto_update.log"

# 打印开始时间
echo "================== $(date '+%Y-%m-%d %H:%M:%S') 开始更新 ==================" | tee -a "$log_file"

# 遍历
for file in "${compose_files[@]}"; do

        # 检查 compose 文件是否存在
        if [ ! -f "$file" ]; then
                echo "[跳过] 找不到 compose 文件:$file" | tee -a "$log_file"
                continue
        fi

        # 获取 compose 文件所在目录
        compose_dir=$(dirname "$file")

        echo "" | tee -a "$log_file"
        echo "-----> 正在更新项目:$file" | tee -a "$log_file"

        # 切换目录
        cd "$compose_dir" || {
                echo "[错误] 无法进入目录:$compose_dir" | tee -a "$log_file"
                continue
        }

        # 拉取镜像
        echo "[执行] docker-compose pull" | tee -a "$log_file"
        docker-compose -f "$file" pull >> "$log_file" 2>&1

        # 重启服务
        echo "[执行] docker-compose up -d" | tee -a "$log_file"
        docker-compose -f "$file" up -d >> "$log_file" 2>&1

        echo "[完成] $file 更新完成" | tee -a "$log_file"
done

# 完成
echo "================== $(date '+%Y-%m-%d %H:%M:%S') 更新完成 ==================" | tee -a "$log_file"
echo "" | tee -a "$log_file"

保存并退出。

三、给脚本执行权限

chmod +x /root/update_all_compose.sh

四、手动执行一次测试

执行脚本:
bash /root/update_all_compose.sh
查看日志:
tail -f /root/docker_auto_update.log

确认所有项目能正常 pull + up。

五、加入系统定时任务

编辑 crontab:
crontab -e
加入:
0 4 * * * /bin/bash /root/update_all_compose.sh

这表示脚本将在 每天凌晨 4 点自动运行。

nano保存方法:
Ctrl+O保存  --->  回车键  --->  Ctrl+X 退出

保存并退出即可。

正文完
 0
评论(没有评论)