Repository navigation
feat(bundle): images a bundle carries as docker save archives, loaded rather than built or pulled - #401
Closed
earakely-scale wants to merge 4 commits into
Closed
feat(bundle): images a bundle carries as docker save archives, loaded rather than built or pulled#401earakely-scale wants to merge 4 commits into
earakely-scale wants to merge 4 commits into
Conversation
… rather than built or pulled
An env, agent or image folder can name an image saved in its folder:
`image = { archive = "image.tar", dockerfile = "Dockerfile", platform = "linux/amd64" }`, or
`archive =` in an image folder's artifact.toml. A run stores it as its tar.gz under
`local/<slug>-<hash>:<archive digest>`, never builds it, and keeps the Dockerfile it names
as its build context beside it. Local Docker loads it (`host_images.load`), and a VM tags
what it loaded with that name when the archive saved it under another one.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…chives out of their folder's listings docker load applies every name an archive embeds, so a bundle's archive could replace an image the loading machine holds under that name. put_archive now stores the archive naming no image (manifest.json RepoTags null, no index.json name annotations, no legacy repositories file), and host_images.load untags every tar.gz on its way to docker load, then tags the image by the immutable ID docker load reports, so concurrent loads can't race on a shared name either. entry_files leaves out every archive an entry's toml names, normalized, so no build context of the folder (a sibling built image's included) and no folder-written file holds one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
entry_archives read every nested `archive` string as an image archive, so a key like an agent's
`default_env_vars = { archive = "assets.zip" }` dropped that file from its build context. It now
reads `archive` only at the docker_image keys the entry's type declares, as the resolver does,
and at an image folder's top level. entity_class moves to authoring.py so both can use it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Collaborator
Author
|
Closing: the bundle export now names each image by its delivery ECR digest, as Harbor does, so bundles don't carry archives. The branch is kept. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
A bundle can carry an image as a
docker savearchive in its folder, which a run loads instead of building or pulling:image = { archive = "image.tar.gz", dockerfile = "Dockerfile", platform = "linux/amd64" }(the last two optional), orarchive =in an image folder'sartifact.toml. It's the first step toward a bundle that runs away from the store it came from.put_archivestores the archive as a tar.gz naming no image (RepoTagsnull, noindex.jsonname annotations) underlocal/<slug>-<hash>:<archive sha256>. Writing it needs no Docker. When the image names adockerfile, the folder is kept beside the archive as its build context.docker load, so no name it embeds replaces an image the machine holds, then tagged by the ID Docker reports.modalcontainers) refuses it in the dry run, as it refuses any tar.gz under a bare tag.Testing
tst/unit/bundle,artifact,providersandutilspass (3346).🤖 Generated with Claude Code


Confidence Score: 5/5
The PR appears safe to merge; the previous file-exclusion bug is fixed.Summary
Adds images carried inside bundles as Docker archives, with storage, reuse checks, and loading on local Docker and VMs.
Diagram
%%{init: {'theme': 'neutral'}}%% flowchart LR A[Bundle archive] --> B[Remove embedded image names] B --> C[Store compressed archive] C --> D[Local Docker or VM loads image] D --> E[Assign stored image name] A --> F[Exclude archive from build context]Reviews (3) · Last reviewed commit: "fix(bundle): an entry's archives are onl..." · Reviewed by Greptile