import json, sys, re

data = json.load(sys.stdin)[0]

def q(s: str) -> str:
    return '"' + s.replace('\\', '\\\\').replace('"', '\\"') + '"'

def safe_key(name: str) -> str:
    k = re.sub(r'[^A-Za-z0-9_.-]+', '_', name)
    if not k or k[0].isdigit():
        k = "v_" + k
    return k

name = (data.get("Name") or "").lstrip("/") or "service"
svc = name

image = data.get("Config", {}).get("Image", "")
env = data.get("Config", {}).get("Env") or []
entrypoint = data.get("Config", {}).get("Entrypoint") or []
cmd = data.get("Config", {}).get("Cmd") or []
workdir = data.get("Config", {}).get("WorkingDir") or ""
user = data.get("Config", {}).get("User") or ""

host = data.get("HostConfig", {})
restart = (host.get("RestartPolicy") or {}).get("Name") or ""

ports = (data.get("NetworkSettings") or {}).get("Ports") or {}
mounts = data.get("Mounts") or []

volume_lines = []
named_vols = {}

for m in mounts:
    mtype = m.get("Type")
    dst = m.get("Destination")
    rw = m.get("RW", True)
    mode = "rw" if rw else "ro"

    if mtype == "bind":
        src = m.get("Source")
        if src and dst:
            volume_lines.append(f"{q(src + ':' + dst + ':' + mode)}")
    elif mtype == "volume":
        actual = m.get("Name")
        if actual and dst:
            key = safe_key(actual)
            named_vols[key] = actual
            volume_lines.append(f"{q(key + ':' + dst + ':' + mode)}")

port_lines = []
for cport, binds in ports.items():
    if not binds:
        continue
    for b in binds:
        hp = b.get("HostPort")
        if not hp:
            continue
        container_port = cport.split("/")[0]
        port_lines.append(q(f"{hp}:{container_port}"))

tmpfs = host.get("Tmpfs") or {}
tmpfs_lines = []
for path, opts in tmpfs.items():
    if opts:
        tmpfs_lines.append(q(f"{path}:{opts}"))
    else:
        tmpfs_lines.append(q(path))

extra_hosts = host.get("ExtraHosts") or []

out = []
out.append('version: "3.8"')
out.append("services:")
out.append(f"  {svc}:")
if image:
    out.append(f"    image: {q(image)}")
out.append(f"    container_name: {q(name)}")

if restart:
    out.append(f"    restart: {q(restart)}")

if workdir:
    out.append(f"    working_dir: {q(workdir)}")

if user:
    out.append(f"    user: {q(user)}")

if env:
    out.append("    environment:")
    for e in env:
        out.append(f"      - {q(e)}")

if port_lines:
    out.append("    ports:")
    for p in port_lines:
        out.append(f"      - {p}")

if volume_lines:
    out.append("    volumes:")
    for v in volume_lines:
        out.append(f"      - {v}")

if tmpfs_lines:
    out.append("    tmpfs:")
    for t in tmpfs_lines:
        out.append(f"      - {t}")

if extra_hosts:
    out.append("    extra_hosts:")
    for h in extra_hosts:
        out.append(f"      - {q(h)}")

if entrypoint:
    out.append("    entrypoint:")
    for x in entrypoint:
        out.append(f"      - {q(str(x))}")

if cmd:
    out.append("    command:")
    for x in cmd:
        out.append(f"      - {q(str(x))}")

if named_vols:
    out.append("volumes:")
    for key, actual in named_vols.items():
        out.append(f"  {key}:")
        out.append(f"    name: {q(actual)}")

print("\n".join(out))
