From f0a84eb491a3fd7f7c810a8761ccffa46c3cc976 Mon Sep 17 00:00:00 2001 From: lstmnemodel Date: Sun, 24 May 2026 02:05:39 +0300 Subject: [PATCH] ultravibed --- src/Containerfile | 4 ++-- src/dnc/cli.py | 27 ++++++++++++++------------- src/dnc/container.py | 6 ++++++ src/dnc/init.sh | 4 ++++ 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/Containerfile b/src/Containerfile index 682c588..14f0205 100644 --- a/src/Containerfile +++ b/src/Containerfile @@ -1,4 +1,4 @@ -ARG PYTHON_IMAGE +ARG PYTHON_IMAGE=python:3.14-slim FROM ${PYTHON_IMAGE} RUN pip install --no-cache-dir docker @@ -11,5 +11,5 @@ RUN apt-get update && apt-get install -y --no-install-recommends curl ca-certifi && rm -rf /var/lib/apt/lists/* COPY src/dnc /opt/dnc/lib/dnc -ENV PYTHONPATH=/opt/dnc/lib:$PYTHONPATH +ENV PYTHONPATH=/opt/dnc/lib ENTRYPOINT ["python3", "-m", "dnc"] diff --git a/src/dnc/cli.py b/src/dnc/cli.py index 68b6f72..975f380 100644 --- a/src/dnc/cli.py +++ b/src/dnc/cli.py @@ -46,15 +46,15 @@ def _show_help(): print(f"""dnc — dockernecontainer v{__version__} Usage: - dnc Enter container - dnc - Run command in container - dnc setup [--image IMG] Create container for this project - dnc rm Remove container + .dnc - dnc list List all dnc containers - dnc info Show container details - dnc agent [--opencode] [--cursor] Create DNC.md + agent rules - dnc version Show version - dnc help Show this help""") + dnc Enter container + dnc -- Run command in container + dnc setup [--image IMG] Create container for this project + dnc rm Remove container + .dnc + dnc list List all dnc containers + dnc info Show container details + dnc agent [--opencode] [--cursor] Create DNC.md + agent rules + dnc version Show version + dnc help Show this help""") def main(): @@ -98,7 +98,7 @@ def main(): if cmd == "setup": parser = argparse.ArgumentParser(prog="dnc setup") parser.add_argument("--image", "-i", default=None) - parsed, _ = parser.parse_known_args(args[1:]) + parsed = parser.parse_args(args[1:]) project_dir = os.getcwd() dnc_path = os.path.join(project_dir, DNC_FILE) @@ -149,7 +149,7 @@ def main(): parser = argparse.ArgumentParser(prog="dnc agent") parser.add_argument("--opencode", action="store_true") parser.add_argument("--cursor", action="store_true") - parsed, _ = parser.parse_known_args(args[1:]) + parsed = parser.parse_args(args[1:]) agents_mod.create_dnc_md(os.getcwd()) if parsed.opencode: agents_mod.create_opencode(os.getcwd()) @@ -167,7 +167,7 @@ def main(): print(f"Removed container '{name}' and {DNC_FILE}.") return - if cmd == "-": + if cmd == "--": dnc_dir, name = resolve_container_name() if name is None: print("No .dnc found. Run 'dnc setup' first.") @@ -180,5 +180,6 @@ def main(): ctr.exec_passthrough(name, rest, interactive=interactive) return - _show_help() + print(f"Unknown command: {cmd}", file=sys.stderr) + print(f"Run 'dnc help' for usage.", file=sys.stderr) sys.exit(1) diff --git a/src/dnc/container.py b/src/dnc/container.py index 6368ecb..b4ebbae 100644 --- a/src/dnc/container.py +++ b/src/dnc/container.py @@ -198,6 +198,7 @@ def create(image: str, name: str, project_dir: str): "dnc.gpu": gpu, } + container = None try: container = client.containers.create( image, @@ -230,6 +231,11 @@ def create(image: str, name: str, project_dir: str): ) container.start() except docker.errors.APIError as e: + if container is not None: + try: + container.remove(force=True) + except Exception: + pass print(f"Error: failed to create/start container '{name}'.", file=sys.stderr) print(f" {e}", file=sys.stderr) sys.exit(1) diff --git a/src/dnc/init.sh b/src/dnc/init.sh index 9e6de1e..c639bf7 100644 --- a/src/dnc/init.sh +++ b/src/dnc/init.sh @@ -39,6 +39,10 @@ if ! command -v sudo >/dev/null 2>&1; then apk add sudo || true elif command -v zypper >/dev/null 2>&1; then zypper install -y sudo || true + elif command -v pacman >/dev/null 2>&1; then + pacman -Sy --noconfirm sudo || true + elif command -v xbps-install >/dev/null 2>&1; then + xbps-install -Sy sudo || true fi fi