我有一些自托管软件,都是以Docker容器的形式运行的。之前都是隔段时间手动升级,不够方便。因此花了点时间写了一个自动升级 脚本,一劳永逸。
import logging
import os
import subprocess
logging.basicConfig(level=logging.INFO)
def upgrade_docker(bash_script_path):
result = subprocess.run(['bash', bash_script_path], capture_output=True, text=True)
logging.info(
"execute %s, stdout %s, stderr %s, success? %s",
bash_script_path, result.stdout, result.stderr, result.returncode == 0,
)
def upgrade_all():
# iter all bash scripts in the 'docker' directory
for file in os.listdir('docker'):
if file.endswith('.sh'):
upgrade_docker(f'docker/{file}')
# finally, run docker system prune -f
subprocess.run(['docker', 'system', 'prune', '-f'])
if __name__ == '__main__':
upgrade_all()
代码很简单,就是遍历
docker
目录下的所有.sh
文件,然后执行它们。最后再清理一下无用的镜像。
然后在同级目录下创建一个 docker
目录,里面放置所有的升级脚本,比如 docker/alist.sh
:
#!/bin/bash
docker rm -f alist
docker pull xhofe/alist-aria2:latest
docker run -d --restart=always \
-v /var/lib/data/alist:/opt/alist/data \
-p 5244:5244 -e PUID=0 -e PGID=0 -e UMASK=022 \
--name="alist" xhofe/alist-aria2:latest
套路都是一样的,先删除旧容器,再拉取新镜像,最后重新运行容器。
配合一个 cronjob
:
0 0 * * 1 /usr/bin/python3 /path/to/upgrade_docker.py
每周一凌晨自动升级一次,再也不用担心忘记升级了。
更多文章
- socks5 协议详解
- zerotier简明教程
- 搞定面试中的系统设计题
- 用peewee代替SQLAlchemy
- frp 源码阅读与分析(一):流程和概念
- Golang(Go语言)中实现典型的fork调用
- DNSCrypt简明教程
- 一个Gunicorn worker数量引发的血案
- Golang validator使用教程
- Docker组件介绍(一):runc和containerd
- Docker组件介绍(二):shim, docker-init和docker-proxy
- 使用Go语言实现一个异步任务框架
- 协程(coroutine)简介 - 什么是协程?
- SQLAlchemy简明教程
- Go Module 简明教程