Repository navigation
docs: Document private container registry pulls - #774
Conversation
Co-Authored-By: Oz <oz-agent@warp.dev>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
This PR was generated with Warp. Comment |
Co-Authored-By: Oz <oz-agent@warp.dev>
|
I'm starting a first review of this pull request. You can view the conversation on Warp. I completed the review and no human review was requested for this pull request. Comment Powered by Oz |
There was a problem hiding this comment.
Overview
This PR adds a private container registry deployment page for self-hosted Docker and Kubernetes workers, updates related self-hosting pages, and adds the page to the sidebar. The overall structure is useful, and the attached spec context contains no approved spec to compare against, but the new Kubernetes examples need fixes before merge.
Concerns
- The pull-secret command documents a registry token as a literal command placeholder; use a safer input pattern so the credential is not copied into shell history and the username/token placeholders are defined before use.
- The Helm values example uses
BASE_IMAGE_TAG, but the page never defines that placeholder and the earlier mirror command createsagent-base:22.04.
Verdict
Found: 0 critical, 2 important, 0 suggestions
Request changes
Comment /warp-agent-review on this pull request to retrigger a review (up to 3 times on the same pull request).
Powered by Oz
There was a problem hiding this comment.
Review summary
The independent agent completed its review for this commit.
Findings
PR body #774 § Documentation risk— [SUGGESTION] The risk section omits aSource files consulted:field per the doc-quality-policy.md template (source files are only listed in prose under '## Unverified claims'). Requested resolution: addSource files consulted: oz-agent-worker/Dockerfile@530bbe9, internal/config/config.go@530bbe9, internal/worker/docker.go@530bbe9, internal/worker/kubernetes.go@530bbe9, charts/oz-agent-worker/@530bbe9to '## Documentation risk'.src/content/docs/platform/self-hosting/private-container-registry.mdx:198-201— [NIT] The four 'Related pages' bullets use a plain hyphen '-' instead of the em dash '—' used by every other Related-pages list touched in this PR (managed-docker.mdx, managed-kubernetes.mdx, reference.mdx). Requested resolution: replace '-' with '—' in all four bullets for consistency.
Verdict
Approve with nits
Co-Authored-By: Oz <oz-agent@warp.dev>
There was a problem hiding this comment.
Review summary
The independent agent completed its review for this commit.
Findings
src/content/docs/platform/self-hosting/private-container-registry.mdx:153— [SUGGESTION] The Helm install step relies ongit clone https://github.com/warpdotdev/oz-agent-worker.git, but a network that blocks public-registry egress (this page's premise) may also block GitHub. Requested resolution: add a note telling readers to pre-stage the repo/chart via an internal mirror before relying on this step.src/content/docs/platform/self-hosting/private-container-registry.mdx:47— [NIT] The Skopeo copy example unconditionally mirrorsbusybox:1.36, which the table on line 19 scopes to the Kubernetes backend only. Requested resolution: add a short aside telling Docker-only readers they can skip this image.
Verdict
Approve with nits
Resolve self-hosting conflicts and incorporate source-verified registry guidance. Co-Authored-By: Oz <oz-agent@warp.dev>
There was a problem hiding this comment.
Review summary
The independent agent completed its review for this commit.
Findings
src/content/docs/platform/self-hosting/private-container-registry.mdx:140— [IMPORTANT] "Confirm the worker logs show the private task and sidecar references" does not hold at the default log level: the Kubernetes backend logs the task image only at debug level (oz-agent-worker internal/worker/kubernetes.go:200) and the Helm chart defaults worker.logLevel to info. Requested change: tell readers to setworker.logLevel: debugfor the test run, or drop the log claim and rely on the Pod image inspection (for Docker, cite thePulling imageandReusing local imageinfo lines).src/content/docs/platform/self-hosting/private-container-registry.mdx:67— [SUGGESTION]image_pull_policy: "IfNotPresent"with the mutablewarp-agent:latestsidecar contradicts the line 23 advice to refresh the mirror regularly, because hosts that already hold the image keep the old copy. Requested change: note that refreshedlatestimages reach only hosts that pull them and recommendAlwaysor a pinned tag, or choose a policy that matches the refresh advice.src/content/docs/platform/self-hosting/private-container-registry.mdx:99— [SUGGESTION]tag: WORKER_TAGis a literal YAML placeholder while the page definesWORKER_TAGonly as a shell variable and usesYOUR_WORKER_RELEASE_TAGin the git clone at line 116;TASK_PODat line 144 is never explained. Requested change: use one placeholder name for the release tag across the skopeo, Helm values, and clone steps, and add a sentence before thekubectl get podcommand explainingTASK_POD.src/content/docs/platform/self-hosting/private-container-registry.mdx:116— [SUGGESTION] The Helm install runsgit clone https://github.com/warpdotdev/oz-agent-worker.giton a network the page assumes cannot reach public registries, so GitHub may also be blocked. Requested change: tell readers to fetchcharts/oz-agent-workerfor the release tag ahead of time and use an internal copy of the chart in this step.src/content/docs/platform/self-hosting/private-container-registry.mdx:159— [SUGGESTION] The caveat that the Warp environment image controls the task image and the worker does not rewrite its registry host appears at lines 71, 128, and 159, which violates the AGENTS.md Say it once rule. Requested change: keep the full statement at line 71 and shorten lines 128 and 159 to a one-line pointer to the environment-image step.src/content/docs/platform/self-hosting/managed-kubernetes.mdx:199— [SUGGESTION] "Warp-hosted agents instead use the private-registry credential assigned to their runner" is off-topic on the Kubernetes backend page, has no blank line separating it from the RBAC paragraph, duplicates private-container-registry.mdx line 10, and depends on warp-server source this review could not verify. Requested change: keep only the self-hostedimagePullSecretssentence here, add a blank line before it, and leave the hosted-runner statement on the private-container-registry page.
Verdict
Request changes
Co-Authored-By: Oz <oz-agent@warp.dev>
Co-Authored-By: Oz <oz-agent@warp.dev>
There was a problem hiding this comment.
Review summary
The independent agent completed its review for this commit.
Findings
src/content/docs/platform/self-hosting/private-container-registry.mdx:115-126— [IMPORTANT] Thehelm upgrade --installstep never creates or references the API key Secret. The chart defaultswarp.apiKeySecret.createtofalseand readsWARP_API_KEYfrom the pre-existing Secretoz-agent-worker, so the worker pod cannot start and the log check at line 135 never succeeds. Requested change: add a step that creates the Secret inwarp-ozbefore installing (or setwarp.apiKeySecret.createand value), or link to thewarp.apiKeySecret.*values in the Managed: Kubernetes page.src/content/docs/platform/self-hosting/private-container-registry.mdx:130— [SUGGESTION] The## Verifying registry isolationsection covers only the Kubernetes backend, but the page also configures the Docker backend, which has no verification path. Requested change: rename the heading to name Kubernetes, or add a short Docker verification (for example, worker logs showing the pulled image names).src/content/docs/platform/self-hosting/managed-kubernetes.mdx:200— [SUGGESTION] The added sentence 'Self-hosted task pods use the registry credentials inimagePullSecrets.' does not name the setting and sits between the RBAC and instance-shape paragraphs. Requested change: namekubernetesBackend.podTemplate.imagePullSecrets, link to the private container registry page, and move the sentence next to the pod template or preflight discussion.src/content/docs/platform/self-hosting/managed-docker.mdx:110— [SUGGESTION] The 'Common CLI flags' block uses--group-add "$DOCKER_SOCKET_GID"without defining the variable in that block, while the registry example later computes the GID inline withstat. Requested change: defineDOCKER_SOCKET_GIDin this block or point to the earlier definition, and use one pattern in both places.
Verdict
Request changes
Co-Authored-By: Oz <oz-agent@warp.dev>
Co-Authored-By: Oz <oz-agent@warp.dev>
There was a problem hiding this comment.
Review summary
The independent agent completed its review for this commit.
Findings
src/content/docs/platform/self-hosting/quickstart.mdx:44— [IMPORTANT]stat -c '%g'is GNU syntax, but line 22 says Docker Desktop on macOS works for testing, and macOSstatrejects-c, so--group-addfails. The same command was added atreference.mdx:39andmanaged-docker.mdx:62,:109, and:210. Requested change: scope these examples to a rootful Linux daemon and give macOS and Windows Docker Desktop users a working alternative or a pointer to the Homebrew or binary install, confirmed with engineering.src/content/docs/platform/self-hosting/managed-kubernetes.mdx:205— [IMPORTANT] Compression contract: the page is 2035 words against the 1500 feature-doc budget (1963 before this PR, +72), yet the PR body says the check passed for both managed backend pages and gives no justification for the overage. Requested change: correct the claim and add a justification to the PR body, or trim the added preflight text; do not split the page to fix it.src/content/docs/platform/self-hosting/private-container-registry.mdx:11— [SUGGESTION] "Self-hosted workers use registry credentials from your Docker or Kubernetes infrastructure." is vague and restates later sections. Requested change: delete it or replace it with the specific fact the reader needs before the image inventory.src/content/docs/platform/self-hosting/private-container-registry.mdx:24— [SUGGESTION] The page tells readers to pin the worker image but mirrors and configures the mutablewarpdotdev/warp-agent:latesttag, and the server-sent tag could not be verified against warp-server. Requested change: confirmlatestis the supported tag and add one sentence on why it is not pinned and whether a digest is supported.src/content/docs/platform/self-hosting/private-container-registry.mdx:75— [SUGGESTION] The Docker verification only says to confirm the run succeeds, so it doesn't show that no image still comes from a public registry, unlike the Kubernetes section. Requested change: add a step that shows which task and sidecar images the worker used, or state that this section doesn't verify image sources.src/content/docs/platform/self-hosting/private-container-registry.mdx:115— [SUGGESTION]defaultImageonly applies when the run has no Warp environment image (the server-provided image takes precedence indefaultImageForTask), but this section doesn't say so, unlike the Docker section. Requested change: add that sentence here before the egress-blocking guidance.src/content/docs/platform/self-hosting/reference.mdx:173— [NIT]startupPreflightJobinkubernetes.goalso appliesImagePullPolicyto the preflight image. Requested change: change "task and sidecar images" to "task, sidecar, and preflight images".
Verdict
Request changes
There was a problem hiding this comment.
Review summary
The independent agent completed its review for this commit.
Findings
src/content/docs/platform/self-hosting/private-container-registry.mdx:57-71— [CRITICAL] The Docker backend pulls the Warp Agent sidecar and additional sidecars with no registry credentials (oz-agent-worker docker.go:611 passes an empty auth string; getRegistryAuth is used only for the task image at docker.go:129). Settingsidecar_image: registry.internal.example.com/warp/warp-agent:latestwhile the text says Docker credentials apply will fail withpull access deniedon any authenticated registry. Requested change: state that Docker sidecar pulls are unauthenticated, so the mirrored warp-agent repository must allow anonymous pulls (or give a supported pre-pull and pull-policy alternative). Correct the Docker troubleshooting entry at lines 216-217 and the verification guidance to match, and update the 'Unverified claims' and 'Documentation risk' sections.src/content/docs/platform/self-hosting/managed-docker.mdx:191— [CRITICAL] The rewritten 'Private Docker registries' intro removed the previously accurate statement that sidecar images come from public registries and need no authentication, and now implies the worker's Docker credentials cover all pulls. Requested change: restore that distinction and link to the registry page's sidecar anonymous-pull requirement.src/content/docs/platform/self-hosting/security-and-networking.mdx:71— [SUGGESTION] The edit replaced 'Ensure appropriate access controls on the host' with only mounting instructions, so the Docker backend section no longer warns that socket access is host-privileged. Requested change: keep a one-sentence caution that access to the Docker socket is equivalent to elevated host access, alongside the new group-ID instructions.src/content/docs/platform/self-hosting/managed-kubernetes.mdx:206— [SUGGESTION] The preflight paragraph adds implementation detail (root init container versus image volume mount) on a page already at 2,005 words against the 1,500-word feature-doc budget; the overage is justified in the PR body, but this detail is not something the reader can act on. Requested change: shorten the sentence to what is checked and how to override the image, and link to the reference page for the rest.
Verdict
Request changes
Co-Authored-By: Oz <oz-agent@warp.dev>
There was a problem hiding this comment.
Review summary
The independent agent completed its review for this commit.
Findings
src/content/docs/platform/self-hosting/private-container-registry.mdx:59— [SUGGESTION] The containerized worker flow logs in with a dedicateddocker --config "$WORKER_DOCKER_CONFIG"directory, but the plaindocker pullthat follows doesn't read it, so the sidecar pre-pull can fail withpull access denied. Requested change: name the credentials the pre-pull needs, for example by showingsudo docker --config "$WORKER_DOCKER_CONFIG" pull ...for that case.src/content/docs/platform/self-hosting/private-container-registry.mdx:62— [SUGGESTION]image_pull_policyandsidecar_imageunderbackend.dockerexist only in recent worker releases, but neither this page nor reference.mdx states a minimum version. Requested change: add the minimum worker release (the PR body saysv2026-09-18-23-15-02) to the Docker section so readers on older pinned tags don't hit config validation errors.src/content/docs/platform/self-hosting/private-container-registry.mdx:229— [NIT] The### Kubernetes reportsImagePullBackOff`` heading has no blank line before its paragraph, unlike the Docker heading above it (markdownlint MD022). Requested change: insert a blank line after the heading.src/content/docs/platform/self-hosting/managed-docker.mdx:73— [SUGGESTION] The Docker Desktop sentence (and the matching change at quickstart.mdx:22) replaces the earlier "Docker Desktop works for testing" claim, but none of the cited source files cover Docker Desktop socket permissions and## Unverified claimssays None. Requested change: cite the evidence in the PR body, or add aVERIFYmarker and list it under## Unverified claims.src/content/docs/platform/self-hosting/managed-docker.mdx:191— [SUGGESTION] The explanation that sidecar pulls don't use registry credentials and that authenticated sidecar repositories need pre-pulled images appears here, in private-container-registry.mdx (Docker section and Troubleshooting), and in the PR's known limitations. Requested change: keep the full explanation on the private-container-registry page and reduce this paragraph to a one-line pointer.src/content/docs/platform/self-hosting/managed-kubernetes.mdx:206— [SUGGESTION] The page is 2,000 words against the 1,500-word feature-doc budget. The overage is justified in the PR body, so it is not blocking. Requested change: when touching the preflight paragraph, drop a sentence, for example the trailinguse_image_volumespointer that the reference page already covers.
Verdict
Approve with nits
Co-Authored-By: Oz <oz-agent@warp.dev>
There was a problem hiding this comment.
Review summary
The independent agent completed its review for this commit.
Findings
src/content/docs/platform/self-hosting/quickstart.mdx:22— [SUGGESTION] "rootful Docker daemon" is unexplained at first use, and removing the Docker Desktop line leaves macOS and Windows readers with no path; the next section'sstat -c '%g'is GNU stat and fails on macOS. Requested change: define "rootful" in a clause, point those readers to the Homebrew or binary install (managed-docker Option 2), and note the GNU stat limitation.src/content/docs/platform/self-hosting/managed-docker.mdx:25— [SUGGESTION] The edit drops the statement that Docker Desktop works for testing and that the worker host can use any OS, and the PR body does not record why. Requested change: record the reason in the PR body, and add a one-line statement of what macOS and Windows hosts should do or confirm none is intended.src/content/docs/platform/self-hosting/managed-kubernetes.mdx:206— [SUGGESTION] The page is 1,989 words against the 1,500 feature-doc budget (justified in the PR body as a pre-existing overage), and the rewritten sentence "Failure stops the worker before tasks" is clipped. Requested change: restore plain wording such as "If preflight fails, the worker exits before accepting tasks."src/content/docs/platform/self-hosting/reference.mdx:165— [SUGGESTION] Dockersidecar_imagefirst shipped in worker release v2026-08-28-21-43-14 and Dockerimage_pull_policyin v2026-08-20-16-38-31, but the reference entries state no minimum release, so readers on older workers get a rejected config key. Requested change: add the minimum release to both entries.src/content/docs/platform/self-hosting/private-container-registry.mdx:86— [SUGGESTION] The Docker section setsworker.yamloptions but never shows how the containerized worker receives that file, and the mirrored worker image needs registry credentials on the host to be pulled. Requested change: add the--config-fileflag with a mount (linking to the reference config-file section) and a sentence on authenticating the host beforedocker run.src/content/docs/platform/self-hosting/private-container-registry.mdx:183— [SUGGESTION] "The connection message confirms that the worker passed Kubernetes API, RBAC, and Pod admission checks..." explains what the log line already shows. Requested change: keep only the sentence that the test run verifies registry credentials, or delete the paragraph.
Verdict
Approve
Co-Authored-By: Oz <oz-agent@warp.dev>
There was a problem hiding this comment.
Review summary
The independent agent completed its review for this commit.
Findings
src/content/docs/platform/self-hosting/private-container-registry.mdx:182— [SUGGESTION]kubectl logs --follownever exits, so a reader following the page top to bottom stays in this command. Requested change: tell the reader to pressCtrl+ConceSuccessfully connected to serverappears, or drop--followand add--tailso the command returns.src/content/docs/platform/self-hosting/private-container-registry.mdx:92— [SUGGESTION] The Kubernetes configuration is a sequence of about six dependent actions (create Secrets, write values, package the chart, copy it, extract it, install) presented as unnumbered code blocks. Requested change: put these actions in a numbered list so the order and the expected outcome of each step are clear.src/content/docs/platform/self-hosting/private-container-registry.mdx:82— [SUGGESTION] "Refresh the mirror regularly" already appears in the Images to mirror section at line 22. Requested change: keep it in one place and delete the repeat here, keeping only the new point that the sidecar uses the mutablelatesttag.src/content/docs/platform/self-hosting/managed-docker.mdx:25— [SUGGESTION] This change removes the documented Docker Desktop on macOS and Windows testing path, and the PR body's Changes list does not mention it. The replacement host-process path was not integration-tested, per the PR body. Requested change: say in the PR body that the prerequisite is deliberately narrowed, or keep a short statement of what is and is not verified for macOS and Windows hosts.src/content/docs/platform/self-hosting/managed-kubernetes.mdx:206— [SUGGESTION] This page is about 1,993 words against the 1,500-word feature-doc budget. The overage is justified in the PR body and pre-dates this PR (1,963 words on main), so it does not block. Requested change: plan a follow-up that moves the configuration reference or operations material onto its own page.
Verdict
Approve with nits
Co-Authored-By: Oz <oz-agent@warp.dev>
Co-Authored-By: Oz <oz-agent@warp.dev>
Co-Authored-By: Oz <oz-agent@warp.dev>
Co-Authored-By: Oz <oz-agent@warp.dev>
Co-Authored-By: Oz <oz-agent@warp.dev>
There was a problem hiding this comment.
Review summary
The independent agent completed its review for this commit.
Findings
src/content/docs/factories/self-hosting/private-container-registry.mdx:73— [SUGGESTION] "rundocker login registry.internal.example.comon the host" does not say which account performs the login, and the surrounding steps use a separatesudo docker --config "$WORKER_DOCKER_CONFIG"config for task-image credentials. Requested change: state that this login applies to the account that runsdocker runfor the worker image (usesudo docker loginif run withsudo) and is separate from the dedicated task-image Docker config.src/content/docs/factories/self-hosting/managed-kubernetes.mdx:206— [SUGGESTION] The page is 1,982 words against the 1,500-word feature-doc budget; the overage is pre-existing (1,963 on main) and justified in the PR body, so it does not block. Requested change: track a follow-up deletion-only cut pass or move pod template and operations material to a separate reference or operations page instead of adding more content to this page.
Verdict
Approve
| | `warpdotdev/warp-agent` | Warp Agent runtime mounted at `/agent` | `sidecar_image` or Helm `kubernetesBackend.sidecarImage` | | ||
| | `busybox:1.36` | Kubernetes startup preflight | `preflight_image` or Helm `kubernetesBackend.preflightImage` | | ||
|
|
||
| Pin the worker image to the immutable timestamp tag or digest from the [worker release](https://github.com/warpdotdev/oz-agent-worker/releases). Keep the mirrored Warp Agent sidecar current with the source image. Warp normally sends a version-matched sidecar reference with each task; a static `sidecar_image` override replaces that reference, so an outdated mirror can become incompatible with a newer worker or task. |
There was a problem hiding this comment.
Not sure if this is true, prod sends a static tag, so there shouldn't be a verion-matched tag



What this feature does
Self-hosted Docker and Kubernetes workers can pull worker, task, sidecar, and preflight images from an internal registry after those images are mirrored. Shipped in worker release
v2026-09-18-23-15-02(2026-09-18).Summary
Adds a reference deployment for networks that cannot pull self-hosted worker images directly from public registries.
Changes
private-container-registry.mdxwith an image inventory, multi-architecture Skopeo copy commands, Docker and Kubernetes configuration, a standalone preflight-image pull check, and retained task-Job verification.Content design plan
Target audience and their JTBD: An enterprise platform engineer deploying self-hosted workers into a restricted network who needs the core workload images to come from an approved internal registry.
Problem statement: Existing pages mention registry credentials and the Kubernetes preflight image separately, but do not identify the full core image set or show how Docker and Kubernetes pull from a mirror.
Goals:
Purpose and value added: The page gives evaluators one deployable registry-isolation path while keeping backend pages focused on their primary setup.
Content type and model: Feature documentation (combined) because the reader needs image-selection context, mirror commands, backend configuration, and verification.
Skills and templates to use:
draft_feature_docand.agents/templates/feature-doc.md, with procedural guidance fromdraft_procedural.High-impact scenarios: Covers Warp Agent runs with Docker and Helm deployments. Excludes registry-vendor setup, certificate distribution, Computer Use, and third-party harness images.
Known limitations
image_pull_policy: "Never"; otherwise, the repository must allow anonymous reads.Unverified claims
None — worker image identity, host binary availability, authenticated task-image pulls, unauthenticated Docker sidecar pulls, local-only
Neverpull behavior, minimum Docker-configuration releases, image overrides, Helm values, pull-secret placement, preflight Job behavior, and sidecar tags were verified againstoz-agent-worker@19f897d934a898f04b8d30ae993d2e94b3e6fe18, its published releases and assets,warp-server@6ce1e1cb06b73402f83a736a39e2664cc2c8dab4, the official Skopeo and Kubernetes registry-authentication references, and the public Warp Agent tags page.Documentation risk
Risk: engineering-review-required
Rationale: Adds registry mirroring commands, Docker and Helm configuration, security-relevant egress guidance, and the requirement to pre-pull authenticated Docker sidecar images. The existing managed Kubernetes page remains above the feature-doc budget because it combines backend setup, configuration reference, and operations; this revision keeps its preflight correction concise rather than restructuring the page.
Source files consulted: oz-agent-worker@19f897d: Dockerfile, main.go, internal/config/config.go, internal/worker/{docker,kubernetes,worker}.go, charts/oz-agent-worker, published release assets; warp-server@6ce1e1c: config/prod.yaml, logic/ai/ambient_agents/workers/selfhosted/websocket.go, logic/cloud_environments.go
Docs override: none
Verification
python3 .agents/skills/style_lint/style_lint.py --changed— passed with 0 issues.python3 .agents/skills/check_for_broken_links/check_links.py --internal-only— passed with 0 broken links across 4,318 internal links.python3 .agents/skills/doc_quality_policy/check_compression_contract.py— passed for the private-registry feature page, quickstart, and managed Docker page. The managed Kubernetes page reports 1,982 words against the 1,500 feature-doc budget; itsorigin/mainbaseline is already 1,963 words, so this targeted correction does not split the existing combined setup, reference, and operations page.python3 .agents/skills/create_pr/check_pr_body.py /tmp/pr774-body.md --require-lead-section "## What this feature does"andpython3 .agents/skills/doc_quality_policy/check_pr_contract.py --body /tmp/pr774-body.md— passed for 8 changed files and 0VERIFYmarkers.bash -n— passed.private-registry-values.yaml— passed.oz-agent-workerAPI-key Secret name against the chart helper and Deployment template — passed. Helm was unavailable, sohelm templatewas not run.npx -y node@24.11.0 scripts/generate-openapi-json.mjsandnpx -y node@24.11.0 --stack-size=16384 node_modules/astro/bin/astro.mjs build— passed; Pagefind indexed 396 HTML files and the server build completed.npm run buildwith the environment's default Node stack — failed in the unrelated global/_llms-txt/support.txtgenerator withMaximum call stack size exceeded; the expanded-stack build above completed.trunk check— unavailable because Trunk is not installed in this environment.Co-Authored-By: Oz oz-agent@warp.dev