Jobsuche: Agent pro Benutzer in isoliertem Docker-Container
Jeder Suchlauf läuft nun in einem frischen Container pro Benutzer, dessen pro-Benutzer-Home als ~/.claude gemountet ist — Memories und Session-Contexte liegen damit strikt getrennt pro Benutzer. Die Such-Skills sind Shared-Code aus dem Image und werden im Container nur nach ~/.claude/skills verlinkt. Der Host-Runner startet pro Lauf `docker run --rm` und führt bis zu JOBSUCHE_MAX_PARALLEL (Default 4) Läufe parallel über verschiedene Benutzer aus (jeder hat eigenen Ollama-Key = getrennte Rate-Limits). Der alte gemeinsame ~/.claude-Pfad wird vom Runner nicht mehr beschrieben. - source/agent/: neues Agent-Image (Dockerfile + entrypoint + drei Skills) - scripts/jobsuche-runner.js: agentStarten als docker run, ensureAgentDir, runPool - scripts/jobsuche-runner.sh + bin/-Kopie: Image-Guard - package.json: docker:build-agent (lokal, ohne Registry-Push) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
# syntax=docker/dockerfile:1
|
||||
#
|
||||
# Agent-Image für die isolierte, pro-Benutzer-Jobsuche.
|
||||
#
|
||||
# Anders als das App-Image (Dockerfile im Repo-Root) enthält dieses Image KEINE
|
||||
# Anwendung, sondern ausschließlich die Werkzeuge, die der headless Such-Agent
|
||||
# braucht: Claude Code, curl/python3/jq für die Skill-Skripte (Arbeitsagentur-API,
|
||||
# bt.sh) sowie git. Der eigentliche Suchlauf wird vom Host-Runner pro Lauf als
|
||||
# `docker run --rm` gestartet, mit dem jeweiligen Benutzer-Home als Volume —
|
||||
# dadurch landen Memories und Session-Contexte getrennt pro Benutzer.
|
||||
|
||||
FROM node:20-bookworm-slim
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
# Werkzeuge für die Skill-Skripte: arbeitsagentur.sh = curl+python3, bt.sh =
|
||||
# curl+jq, plus git/flock/bash/coreutils für die Skripte selbst.
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
ca-certificates curl git python3 jq util-linux bash coreutils \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Claude Code auf einem systemweiten Pfad, damit es unabhängig vom zur Laufzeit
|
||||
# gemounteten HOME gefunden wird. Version an den Host-CLI (2.1.209) angeglichen;
|
||||
# DISABLE_AUTOUPDATER verhindert, dass jeder Benutzer sein eigenes Update zieht.
|
||||
RUN npm install -g @anthropic-ai/claude-code@2.1.209
|
||||
ENV DISABLE_AUTOUPDATER=1
|
||||
|
||||
# Nicht-Root-Benutzer, als der der Such-Agent läuft. Das node:20-Image bringt
|
||||
# bereits uid/gid 1000 (»node«) mit — wir verwenden es unverändert, damit der
|
||||
# Container dieselbe uid hat wie das vom Host-Runner gechownte pro-Benutzer-Home.
|
||||
# COPY/Zielordner müssen für uid 1000 schreibbar sein.
|
||||
|
||||
# Geteilte Skills (Shared-Code, lesbar für alle); der Entrypoint verlinkt sie
|
||||
# pro Benutzer nach ~/.claude/skills.
|
||||
COPY skills /opt/skills
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
# Schreibbarer Arbeitsordner (cwd während des Suchlaufs); Projekt-Key von Claude
|
||||
# Code wird -work, also liegen Memory/Contexte unter ~/.claude/projects/-work.
|
||||
# /home/agent wird im Image angelegt (uid 1000), damit der Entrypoint auch ohne
|
||||
# gemountetes Volume (z. B. `docker run … claude --version`) läuft; im echten
|
||||
# Lauf legt der Host-Runner das pro-Benutzer-Volume genau dortüber.
|
||||
RUN mkdir -p /work /home/agent && chown -R 1000:1000 /work /home/agent
|
||||
|
||||
ENV HOME=/home/agent
|
||||
|
||||
WORKDIR /work
|
||||
USER 1000:1000
|
||||
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
CMD ["claude", "--version"]
|
||||
Reference in New Issue
Block a user