| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- # -*- coding: utf-8 -*-
- import subprocess
- import multiprocessing
- import os
- import json
- def load_config():
- with open("config.json", "r") as f:
- return json.load(f)
- config = load_config()
- PREFIX = "clash-multi-"
- START = 1
- END = config["total_container"]
- START_PORT = config["start_port"]
- START_API_PORT = config["start_api_port"]
- START_WEB_PORT = config["start_web_port"]
- def get_docker_run_command(container_id):
- container_name = f"{PREFIX}{container_id}"
- port = START_PORT + container_id
- api_port = START_API_PORT + container_id
- web_port = START_WEB_PORT + container_id
- script_dir = os.path.dirname(os.path.abspath(__file__))
- config_file_path = os.path.join(script_dir, "config", f"config{container_id}.yaml")
- return [
- "docker", "run", "-d",
- "--name", container_name,
- "--restart=always",
- "--log-opt", "max-size=1m",
- "-v", f"{config_file_path}:/root/.config/clash/config.yaml",
- "-p", f"{web_port}:8080",
- "-p", f"{port}:7890",
- "-p", f"{api_port}:9090",
- "laoyutang/clash-and-dashboard:latest"
- ]
- def start_container(container_id):
- container_name = f"{PREFIX}{container_id}"
- print(f"Starting container: {container_name}")
- try:
- cmd = get_docker_run_command(container_id)
- # print(f"Running Docker command: {' '.join(cmd)}")
- subprocess.run(cmd, check=True, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE)
- print(f"Successfully started container: {container_name}")
- except subprocess.CalledProcessError as e:
- error_message = e.stderr.decode().strip() if e.stderr else "Unknown error"
- print(f"Error starting container {container_name}: {error_message}")
- def main():
- with multiprocessing.Pool(processes=os.cpu_count() or 8) as pool:
- pool.map(start_container, range(START, END + 1))
- if __name__ == "__main__":
- main()
|