在日常运维中,我们经常会遇到这样的需求:
服务器上运行着多个基于 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 退出
保存并退出即可。
正文完