备份docker容器构建命令的脚本
Page content
为 每个运行中的容器 生成一个独立的 compose.yml
的Python 脚本,存放在 docker-compose-backup/
目录下。
#!/usr/bin/env python3
import json, subprocess, yaml, os
OUTPUT_DIR = "./docker-compose-backup"
def container_to_compose(container):
data = json.loads(subprocess.check_output(["docker", "inspect", container]))[0]
name = data["Name"].strip("/")
image = data["Config"]["Image"]
env = data["Config"]["Env"] or []
ports = data["NetworkSettings"]["Ports"] or {}
volumes = data["Mounts"] or []
service = {
"image": image,
"container_name": name,
"restart": "unless-stopped",
}
if env:
service["environment"] = env
if ports:
service["ports"] = []
for p, mappings in ports.items():
if mappings:
for m in mappings:
host = (m["HostIp"] if m["HostIp"] else "0.0.0.0") + ":" + m["HostPort"]
service["ports"].append(f"{host}:{p}")
else:
service["ports"].append(p)
if volumes:
service["volumes"] = [f"{v['Source']}:{v['Destination']}" for v in volumes]
# 注意:这里不再写 version 字段
compose = {"services": {name: service}}
return name, compose
def main():
os.makedirs(OUTPUT_DIR, exist_ok=True)
containers = subprocess.check_output(["docker", "ps", "-q"]).decode().split()
if not containers:
print("⚠️ 没有运行中的容器。")
return
for cid in containers:
name, compose = container_to_compose(cid)
outfile = os.path.join(OUTPUT_DIR, f"{name}_compose.yml")
with open(outfile, "w") as f:
yaml.dump(compose, f, default_flow_style=False, sort_keys=False)
print(f"✅ 导出容器 {name} -> {outfile}")
print(f"👉 启动命令示例: docker compose -f {outfile} -p {name} up -d\n")
if __name__ == "__main__":
main()
使用方法
-
安装依赖:
pip install pyyaml
-
保存脚本为
export_compose.py
,加执行权限:chmod +x export_compose.py
-
运行:
./export_compose.py
-
导出的目录结构示例:
docker-compose-backup/ ├── nginx_compose.yml ├── mysql_compose.yml └── redis_compose.yml
现在已经有了 redis_compose.yml
,它本质上就是一个 docker-compose 配置文件,所以用法和任何 docker-compose.yml
一样。
🔹 基本使用
-
启动容器
docker compose -f redis_compose.yml up -d
这会按照
redis_compose.yml
的配置重新创建并运行容器。 (如果容器原来存在,可能会提示名字冲突,可以先删除旧的docker rm -f redis
) -
查看容器状态
docker compose -f redis_compose.yml ps
-
停止容器
docker compose -f redis_compose.yml down