Aller au contenu
English

Garder les données Git dans le conteneur

Essayez les dépôts isolés en conteneur et examinez comment les modifications reviennent sur l’hôte.

Définissez repositoryMode: "isolated" sur un fournisseur Docker ou Podman pour donner au conteneur sa propre copie Git. Cette option est expérimentale ; la tâche conserve les mêmes réglages d’agent et d’exécution.

import { reportValue } from "./reporter.ts";
import { dispatch } from "@elie-laloum/outpost";
import { createDockerSandboxProvider } from "@elie-laloum/outpost/providers/docker";
import { coder, repository } from "./outpost.config.ts";

const sandboxProvider = createDockerSandboxProvider({
  image: "outpost:dev",
  repositoryMode: "isolated",
});

const result = await dispatch({
  repository,
  sandboxProvider,
  agent: coder,
  branch: { mode: "named", name: "outpost/private-fix" },
  brief: { text: "Fix the failing unit test and commit the fix." },
});
reportValue(result.branch, result.commits.length);
// Example output: outpost/private-fix 1

Outpost copie l’historique de la branche dans le conteneur, et l’agent travaille sur cette copie. À la fin de la tâche, ses commits arrivent sur outpost/private-fix côté hôte.

AspectMonté (par défaut)Isolé
Ce que voit le conteneurVotre worktree dans /workspace et les dossiers Git de l’hôteUn checkout privé dans /tmp/outpost/workspace, avec son propre .git
Retour des changementsImmédiat : l’agent écrit dans votre worktreeAprès chaque dispatch, sandbox.command() ou session interactive, validés puis appliqués
Hooks, config et refs de l’hôtePartagés et modifiables : ce que l’agent écrit s’applique sur l’hôteNi copiés à l’aller ni au retour : seuls les commits et fichiers de la branche reviennent
Politique de branche par défautcurrentintegrate ; current est refusé
CLI de l’agentDoit être dans l’imageInstallée dans la sandbox si elle manque ; bootstrap: false désactive l’installation
Spéculation durablePrise en chargeRefusée : le fournisseur ne sait pas récupérer un conteneur abandonné
Terminal interactifPris en chargePris en charge ; les changements reviennent quand vous quittez

copies et includeUncommitted ajoutent des entrées comme sur les sandboxes cloud. Politiques de branche : Dépôt et branche.

Les conteneurs isolés utilisent la même synchronisation que les sandboxes cloud. Avant d’appliquer quoi que ce soit, Outpost valide les commits et fichiers entrants et sauvegarde le worktree de l’hôte.

Si le worktree de l’hôte a changé pendant que la sandbox était active, ou si des fichiers entrants recouvrent des fichiers non commités ou ignorés de l’hôte, la synchronisation s’arrête. Vos fichiers restent intacts, et details.recovery dans l’erreur indique un dossier de transfert sous .outpost/recovery/. Inspectez-le et restaurez-le avec Récupérer du travail.

volumes fonctionne toujours, avec trois règles :

import { createPodmanSandboxProvider } from "@elie-laloum/outpost/providers/podman";

const sandboxProvider = createPodmanSandboxProvider({
  image: "outpost:dev",
  repositoryMode: "isolated",
  volumes: [{ source: "~/datasets", target: "/data", readOnly: true }],
  caches: [{ name: "npm", key: "node24" }],
});
  • Côté hôteUne source ne peut ni contenir ni se trouver dans le dépôt, le worktree ou les dossiers Git, même en lecture seule.
  • Côté conteneurUne cible ne peut pas recouvrir /tmp ni /outpost ; une cible relative se résout dans le checkout et est refusée.
  • Caches de dépendancesLes volumes caches fonctionnent toujours ; Outpost les monte sous /outpost/cache.
  • L’isolation protège les métadonnées Git de l’hôte, pas l’hôte face à un agent hostile. Vous faites toujours confiance à l’image, au moteur de conteneurs, au noyau et à chaque montage explicite. Voir Sécurité.
  • Le code écrit par l’agent revient sur votre hôte. Relisez-le avant de l’y exécuter.
  • Seuls Docker et Podman ont ce mode. Les sandboxes cloud et Firecracker travaillent toujours sur une copie ; l’exécution sur l’hôte, jamais.

API : ContainerOptions · createDockerSandboxProvider · createPodmanSandboxProvider · Volume.