#!/usr/bin/env python3 import sys, yaml from datetime import datetime, timezone def md(v): return str(v).replace('|','\\|') if v is not None else '' inp,out=sys.argv[1],sys.argv[2] with open(inp) as f: c=yaml.safe_load(f) or {} svcs=c.get('services',{}) or {} nets=c.get('networks',{}) or {} vols=c.get('volumes',{}) or {} lines=["# Docker Compose Inventory","",f"Generated: {datetime.now(timezone.utc).strftime('%Y-%m-%dT%H:%M:%SZ')}","","## Summary","","| Item | Count |","|---|---:|",f"| Services | {len(svcs)} |",f"| Networks | {len(nets)} |",f"| Volumes | {len(vols)} |","","## Services","","| Service | Container | Image | Build | Profiles | Networks | Ports | Restart |","|---|---|---|---|---|---|---|---|"] for n,s in sorted(svcs.items()): build=s.get('build','') if isinstance(build,dict): build=build.get('context','') ports=', '.join(str(p) for p in s.get('ports',[]) ) networks=', '.join((s.get('networks') or {}).keys() if isinstance(s.get('networks'),dict) else (s.get('networks') or [])) profiles=', '.join(s.get('profiles',[]) or []) lines.append(f"| {md(n)} | {md(s.get('container_name',''))} | {md(s.get('image',''))} | {md(build)} | {md(profiles)} | {md(networks)} | {md(ports)} | {md(s.get('restart',''))} |") lines += ["","## Networks","","| Network | Driver | External |","|---|---|---|"] for n,v in sorted(nets.items()): lines.append(f"| {md(n)} | {md((v or {}).get('driver',''))} | {md((v or {}).get('external',False))} |") lines += ["","## Volumes","","| Volume | External |","|---|---|"] for n,v in sorted(vols.items()): lines.append(f"| {md(n)} | {md((v or {}).get('external',False))} |") open(out,'w').write('\n'.join(lines)+'\n')