ultravibed
This commit is contained in:
+2
-2
@@ -1,4 +1,4 @@
|
|||||||
ARG PYTHON_IMAGE
|
ARG PYTHON_IMAGE=python:3.14-slim
|
||||||
FROM ${PYTHON_IMAGE}
|
FROM ${PYTHON_IMAGE}
|
||||||
|
|
||||||
RUN pip install --no-cache-dir docker
|
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/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
COPY src/dnc /opt/dnc/lib/dnc
|
COPY src/dnc /opt/dnc/lib/dnc
|
||||||
ENV PYTHONPATH=/opt/dnc/lib:$PYTHONPATH
|
ENV PYTHONPATH=/opt/dnc/lib
|
||||||
ENTRYPOINT ["python3", "-m", "dnc"]
|
ENTRYPOINT ["python3", "-m", "dnc"]
|
||||||
|
|||||||
+14
-13
@@ -46,15 +46,15 @@ def _show_help():
|
|||||||
print(f"""dnc — dockernecontainer v{__version__}
|
print(f"""dnc — dockernecontainer v{__version__}
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
dnc Enter container
|
dnc Enter container
|
||||||
dnc - <cmd> Run command in container
|
dnc -- <cmd> Run command in container
|
||||||
dnc setup [--image IMG] Create container for this project
|
dnc setup [--image IMG] Create container for this project
|
||||||
dnc rm Remove container + .dnc
|
dnc rm Remove container + .dnc
|
||||||
dnc list List all dnc containers
|
dnc list List all dnc containers
|
||||||
dnc info Show container details
|
dnc info Show container details
|
||||||
dnc agent [--opencode] [--cursor] Create DNC.md + agent rules
|
dnc agent [--opencode] [--cursor] Create DNC.md + agent rules
|
||||||
dnc version Show version
|
dnc version Show version
|
||||||
dnc help Show this help""")
|
dnc help Show this help""")
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
@@ -98,7 +98,7 @@ def main():
|
|||||||
if cmd == "setup":
|
if cmd == "setup":
|
||||||
parser = argparse.ArgumentParser(prog="dnc setup")
|
parser = argparse.ArgumentParser(prog="dnc setup")
|
||||||
parser.add_argument("--image", "-i", default=None)
|
parser.add_argument("--image", "-i", default=None)
|
||||||
parsed, _ = parser.parse_known_args(args[1:])
|
parsed = parser.parse_args(args[1:])
|
||||||
|
|
||||||
project_dir = os.getcwd()
|
project_dir = os.getcwd()
|
||||||
dnc_path = os.path.join(project_dir, DNC_FILE)
|
dnc_path = os.path.join(project_dir, DNC_FILE)
|
||||||
@@ -149,7 +149,7 @@ def main():
|
|||||||
parser = argparse.ArgumentParser(prog="dnc agent")
|
parser = argparse.ArgumentParser(prog="dnc agent")
|
||||||
parser.add_argument("--opencode", action="store_true")
|
parser.add_argument("--opencode", action="store_true")
|
||||||
parser.add_argument("--cursor", 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())
|
agents_mod.create_dnc_md(os.getcwd())
|
||||||
if parsed.opencode:
|
if parsed.opencode:
|
||||||
agents_mod.create_opencode(os.getcwd())
|
agents_mod.create_opencode(os.getcwd())
|
||||||
@@ -167,7 +167,7 @@ def main():
|
|||||||
print(f"Removed container '{name}' and {DNC_FILE}.")
|
print(f"Removed container '{name}' and {DNC_FILE}.")
|
||||||
return
|
return
|
||||||
|
|
||||||
if cmd == "-":
|
if cmd == "--":
|
||||||
dnc_dir, name = resolve_container_name()
|
dnc_dir, name = resolve_container_name()
|
||||||
if name is None:
|
if name is None:
|
||||||
print("No .dnc found. Run 'dnc setup' first.")
|
print("No .dnc found. Run 'dnc setup' first.")
|
||||||
@@ -180,5 +180,6 @@ def main():
|
|||||||
ctr.exec_passthrough(name, rest, interactive=interactive)
|
ctr.exec_passthrough(name, rest, interactive=interactive)
|
||||||
return
|
return
|
||||||
|
|
||||||
_show_help()
|
print(f"Unknown command: {cmd}", file=sys.stderr)
|
||||||
|
print(f"Run 'dnc help' for usage.", file=sys.stderr)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|||||||
@@ -198,6 +198,7 @@ def create(image: str, name: str, project_dir: str):
|
|||||||
"dnc.gpu": gpu,
|
"dnc.gpu": gpu,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
container = None
|
||||||
try:
|
try:
|
||||||
container = client.containers.create(
|
container = client.containers.create(
|
||||||
image,
|
image,
|
||||||
@@ -230,6 +231,11 @@ def create(image: str, name: str, project_dir: str):
|
|||||||
)
|
)
|
||||||
container.start()
|
container.start()
|
||||||
except docker.errors.APIError as e:
|
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"Error: failed to create/start container '{name}'.", file=sys.stderr)
|
||||||
print(f" {e}", file=sys.stderr)
|
print(f" {e}", file=sys.stderr)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|||||||
@@ -39,6 +39,10 @@ if ! command -v sudo >/dev/null 2>&1; then
|
|||||||
apk add sudo || true
|
apk add sudo || true
|
||||||
elif command -v zypper >/dev/null 2>&1; then
|
elif command -v zypper >/dev/null 2>&1; then
|
||||||
zypper install -y sudo || true
|
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
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user