备份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()

使用方法

  1. 安装依赖:

    pip install pyyaml
    
  2. 保存脚本为 export_compose.py,加执行权限:

    chmod +x export_compose.py
    
  3. 运行:

    ./export_compose.py
    
  4. 导出的目录结构示例:

    docker-compose-backup/
    ├── nginx_compose.yml
    ├── mysql_compose.yml
    └── redis_compose.yml
    

现在已经有了 redis_compose.yml,它本质上就是一个 docker-compose 配置文件,所以用法和任何 docker-compose.yml 一样。


🔹 基本使用

  1. 启动容器

    docker compose -f redis_compose.yml up -d
    

    这会按照 redis_compose.yml 的配置重新创建并运行容器。 (如果容器原来存在,可能会提示名字冲突,可以先删除旧的 docker rm -f redis

  2. 查看容器状态

    docker compose -f redis_compose.yml ps
    
  3. 停止容器

    docker compose -f redis_compose.yml down