Linux定时批量更新Docker镜像
HDUZN

因为在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
  • 本文标题:Linux定时批量更新Docker镜像
  • 本文作者:HDUZN
  • 创建时间:2025-03-09 15:28:07
  • 本文链接:http://hduzn.cn/2025/03/09/Linux定时批量更新Docker镜像/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论