Skip to main content

Running in Docker

Build locally and inspect commands that require no mounts or network:

docker build -t subzerodev-github:local .
docker run --rm --network none subzerodev-github:local manifest
docker run --rm --network none subzerodev-github:local --help

The image runs as non-root UID 10001. It reads configuration from /etc/subzerodev/plugin.config.json and uses /var/lib/subzerodev/cache and /var/lib/subzerodev/output. Mount configuration and a seeded cache read-only; only cache/output mounts need write access for the commands that update them.

docker run --rm --read-only \
--env GITHUB_TOKEN \
--volume "$PWD/github.config.json:/etc/subzerodev/plugin.config.json:ro" \
--volume "$PWD/.cache:/var/lib/subzerodev/cache" \
--volume "$PWD/output:/var/lib/subzerodev/output" \
subzerodev-github:local sync --json

Passing --user "$(id -u):$(id -g)" is supported when Linux bind-mount ownership requires the host identity. The image declares no VOLUME, so this override does not create or hide anonymous volumes.

The runner offers the same workflow from PowerShell:

$env:GITHUB_TOKEN = 'github_pat_replace_me'
./run.ps1 -Mode Docker -BuildImage sync --json

The runner mounts examples/github.config.json by default. Pass -ConfigPath ./github.config.json after copying and customizing the example.

The container conformance check builds the image, runs the bare manifest without network, verifies identity/version labels and non-root execution, exercises a read-only configuration and seeded cache, compares repeated exports byte-for-byte, and scans runtime output and the saved image for a secret canary.