#!/usr/bin/env python3 """ 在远程节点上执行 docker compose 操作。 用法: python remote.py <服务目录> <命令> 命令: up 启动/更新容器(不拉镜像) recreate 强制重建容器(up -d --force-recreate,改配置后用) restart 重启 compose 内所有服务 upgrade 拉取镜像并重建容器 ps 查看容器状态 logs 查看最近日志(非 follow) """ from __future__ import annotations import argparse import os import subprocess import sys from lib import project_root, run_remote, service_info REMOTE_COMMANDS = { "up": "docker compose up -d", "recreate": "docker compose up -d --force-recreate", "restart": "docker compose restart", "upgrade": "docker compose pull && docker compose up -d", "ps": "docker compose ps", "logs": "docker compose logs --tail=100", } def run_for_service(service_dir: str, action: str) -> int: info = service_info(service_dir) compose_command = REMOTE_COMMANDS[action] endpoint = info["node"] if info.get("port") is not None: endpoint = f"{endpoint}:{info['port']}" print(f"服务: {service_dir} -> {endpoint}:{info['remote_dir']}") return run_remote(info, compose_command, remote_cwd=info["remote_dir"]) def main() -> int: parser = argparse.ArgumentParser(description="在远程节点执行 docker compose 操作") parser.add_argument("target", help="服务目录,例如 hosts/web1/myapp") parser.add_argument( "action", choices=sorted(REMOTE_COMMANDS), help="远程操作", ) args = parser.parse_args() os.chdir(project_root()) return run_for_service(args.target, args.action) if __name__ == "__main__": sys.exit(main())