From 07dec180c7cdb960d20aca26cbd2b02a02c986d7 Mon Sep 17 00:00:00 2001 From: Menno van Leeuwen Date: Wed, 12 Mar 2025 21:19:23 +0100 Subject: [PATCH] fix: add support for starting and stopping all Docker services --- bin/actions/service.py | 81 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 77 insertions(+), 4 deletions(-) diff --git a/bin/actions/service.py b/bin/actions/service.py index 908ae79..06856b7 100755 --- a/bin/actions/service.py +++ b/bin/actions/service.py @@ -44,14 +44,79 @@ def run_docker_compose(args, service_name=None, compose_file=None): return result.returncode +def get_all_services(): + """Return a list of all available services""" + if not os.path.exists(SERVICES_DIR): + return [] + + services = [ + d + for d in os.listdir(SERVICES_DIR) + if os.path.isdir(os.path.join(SERVICES_DIR, d)) + and os.path.exists(os.path.join(SERVICES_DIR, d, "docker-compose.yml")) + ] + + return sorted(services) + + def cmd_start(args): """Start a Docker service""" - return run_docker_compose(["up", "-d"], service_name=args.service) + if args.all: + services = get_all_services() + if not services: + printfe("yellow", "No services found to start") + return 0 + + printfe("blue", f"Starting all services: {', '.join(services)}") + + failed_services = [] + for service in services: + printfe("blue", f"\n=== Starting {service} ===") + result = run_docker_compose(["up", "-d"], service_name=service) + if result != 0: + failed_services.append(service) + + if failed_services: + printfe( + "red", + f"\nFailed to start the following services: {', '.join(failed_services)}", + ) + return 1 + else: + printfe("green", "\nAll services started successfully") + return 0 + else: + return run_docker_compose(["up", "-d"], service_name=args.service) def cmd_stop(args): """Stop a Docker service""" - return run_docker_compose(["down"], service_name=args.service) + if args.all: + running_services = get_all_running_services() + if not running_services: + printfe("yellow", "No running services found to stop") + return 0 + + printfe("blue", f"Stopping all running services: {', '.join(running_services)}") + + failed_services = [] + for service in running_services: + printfe("blue", f"\n=== Stopping {service} ===") + result = run_docker_compose(["down"], service_name=service) + if result != 0: + failed_services.append(service) + + if failed_services: + printfe( + "red", + f"\nFailed to stop the following services: {', '.join(failed_services)}", + ) + return 1 + else: + printfe("green", "\nAll running services stopped successfully") + return 0 + else: + return run_docker_compose(["down"], service_name=args.service) def cmd_restart(args): @@ -200,11 +265,19 @@ def main(): # Start command start_parser = subparsers.add_parser("start", help="Start a Docker service") - start_parser.add_argument("service", help="Service to start") + start_parser_group = start_parser.add_mutually_exclusive_group(required=True) + start_parser_group.add_argument( + "--all", action="store_true", help="Start all services" + ) + start_parser_group.add_argument("service", nargs="?", help="Service to start") # Stop command stop_parser = subparsers.add_parser("stop", help="Stop a Docker service") - stop_parser.add_argument("service", help="Service to stop") + stop_parser_group = stop_parser.add_mutually_exclusive_group(required=True) + stop_parser_group.add_argument( + "--all", action="store_true", help="Stop all running services" + ) + stop_parser_group.add_argument("service", nargs="?", help="Service to stop") # Restart command restart_parser = subparsers.add_parser("restart", help="Restart a Docker service")