Files
thePlug/app/utils/docker/compose.py
T
reloia 4fa25355e7 chore: refactor all docker logic files structure
- Implement compose.py with functions to find compose files, list services, and aggregate service info
- Add editor.py for changing service ports with backup support
- Define DockerService model in models.py
- Refactor ports.py to support new port mapping logic and helpers
- Expose Docker Compose utilities in __init__.py
2026-04-12 19:46:48 +00:00

76 lines
1.9 KiB
Python

from pathlib import Path
import yaml
from utils.docker.models import DockerService
from utils.docker.ports import _get_service_port
COMPOSE_NAMES = (
"compose.yml",
"compose.yaml",
"docker-compose.yml",
"docker-compose.yaml",
)
def get_visible_folders(directory: Path) -> list[Path]:
return [
p for p in Path(directory).iterdir() if p.is_dir() and not p.name.startswith(".")
]
def find_docker_compose(path: Path) -> tuple[dict, str] | None:
if not path or not path.is_dir():
return None
for name in COMPOSE_NAMES:
file = path / name
if file.is_file():
content = yaml.safe_load(file.read_text()) or {}
return content, file.name
return None
def get_services(folder: Path) -> list[DockerService] | None:
services: list[DockerService] = []
compose_data = find_docker_compose(folder)
if compose_data is None:
return None
docker_compose, _ = compose_data
compose_services = docker_compose.get("services") or {}
if not compose_services:
return None
for service_name, config in compose_services.items():
mappings = config.get("ports") if isinstance(config, dict) else None
if not isinstance(mappings, list) or not mappings:
continue
ports = [
p
for p in (_get_service_port(mapping) for mapping in mappings)
if p is not None
]
if not ports:
continue
services.append({"name": service_name, "ports": ports})
return services or None
def get_all_services(directory: str | Path) -> list[DockerService] | None:
path = Path(directory)
if not path.is_dir():
return None
services: list[DockerService] = []
for sub_folder in get_visible_folders(path):
sub_services = get_services(sub_folder)
if sub_services:
services.extend(sub_services)
return services or None