Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add new commands to support uploading and downloading images #1366

Open
1 task
qweeah opened this issue Apr 23, 2024 · 22 comments
Open
1 task

Add new commands to support uploading and downloading images #1366

qweeah opened this issue Apr 23, 2024 · 22 comments
Assignees
Labels
enhancement New feature or request spec required Issues that require specifications
Milestone

Comments

@qweeah
Copy link
Contributor

qweeah commented Apr 23, 2024

What is the version of your ORAS CLI

oras v1.1.0

What would you like to be added?

Had an offline discussion with @shizhMSFT and he suggests to add two commands:

  • oras backup (alias: snapshot, pull-image) to support saving an image from remote registry to an OCI image layout tar archive.
Usage:
  oras backup --output <oci_layout_path> <reg>/<repo>[{:<tag>|@digest]}] [...]
  • oras restore (alias: push-image) to support pushing an image from an OCI image layout tar archive to remote registry.
Usage:
  oras restore --output <reg>/<repo> <oci_layout_path>[{:<tag>|@digest]}]

Why is this needed for ORAS?

oras cp is not intuitive to use, e.g. user might use oras push to push images from an OCI layout and succeed with false positive (see #1353). Adding those two wrapper commands of oras cp can help avoid that.

Are you willing to submit PRs to contribute to this feature?

  • Yes, I am willing to implement it.
@qweeah qweeah added enhancement New feature or request triage New issues or PRs to be acknowledged by maintainers labels Apr 23, 2024
@TerryHowe
Copy link
Member

TerryHowe commented Apr 23, 2024 via email

@shizhMSFT
Copy link
Contributor

Why not backup and restore?

Nice input. I've revised the proposal accordingly to oras backup and marked snapshot as an alias.

@qweeah qweeah removed the triage New issues or PRs to be acknowledged by maintainers label May 7, 2024
@qweeah qweeah added this to the v1.3.0 milestone May 7, 2024
@shizhMSFT shizhMSFT added the spec required Issues that require specifications label Jul 24, 2024
@sajayantony
Copy link
Contributor

Could you also include reasoning why pull doesn't work here.

oras pull --to-oci-layout <oci_layout_path> <reg>/<repo>[{:<tag>|@digest]}] [...]

@sajayantony
Copy link
Contributor

As per the call I'm ok if we limit to tar archive only dealing.

@shizhMSFT
Copy link
Contributor

shizhMSFT commented Jul 24, 2024

As per the call, here is an alternative without introducing new commands.

  • oras backup --> oras pull --archive <tar_path> <name>{:<tag>|@<digest>}
  • oras restore --> oras push --archive <tar_path> <name>[:<tag>[,<tag>][...]] <file>[:<type>] [...]

The major difference between oras backup/restore and oras pull/push is that oras backup/restore can take multiple images across registries and repositories.

Example usages are

# working with remote registry
oras pull localhost:5000/hello:v1 --archive hello.tar # backup hello:v1 to hello.tar
oras push localhost:5000/hello:v1 --archive hello.tar # restore hello:v1 from hello.tar

# working with entire repository
oras pull localhost:5000/hello --archive hello.tar # backup all images in hello to hello.tar
oras push localhost:5000/hello --archive hello.tar # restore all images in hello.tar

# working with multiple images
oras pull localhost:5000/hello:v1,foo,bar --archive hello.tar # backup v1, foo, and bar
oras push localhost:5000/hello:v1,foo --archive hello.tar     # restore v1 and foo, and ignore bar

# working with referrers
oras pull --include-referrers localhost:5000/hello:v1 --archive hello.tar
oras push --include-referrers localhost:5000/hello:v1 --archive hello.tar

# working with OCI layout. UX would be better if using `oras cp`.
oras pull --oci-layout layout.tar:v1 --archive hello.tar
oras pull --oci-layout layout-dir:v1 --archive hello.tar
oras push --oci-layout layout-dir:v1 --archive hello.tar

@qweeah
Copy link
Contributor Author

qweeah commented Jul 24, 2024

oras restore --> oras push --archive <tar_path> [:[,][...]] [:] [...]

I think the usage is change to oras push <name>[:<tag>[,<tag>][...]] {<file>[:<type>] [...]|--archive <tar_path>}.

@TerryHowe
Copy link
Member

Currently, pull skips successors though, right?

@qweeah
Copy link
Contributor Author

qweeah commented Jul 24, 2024

Currently, pull skips successors though, right?

Depends on the type. subject are skipped unless --include-subject is specified. manifests in an index will be pulled.

@TerryHowe
Copy link
Member

This issue is what I was requesting on #730

@shizhMSFT
Copy link
Contributor

This issue is what I was requesting on #730

Yes, exactly. The difference is that the requirements are getting clearer after 1.5 years where more tools, including docker, are adopting OCI image layout.

@liamwh
Copy link

liamwh commented Oct 7, 2024

Is this being worked on at all? Would love to see it in ORAS!

@qweeah
Copy link
Contributor Author

qweeah commented Oct 8, 2024

There is a little difference between the proposal and #730: cross-repository operation is not in scope here.

@liamwh
Copy link

liamwh commented Oct 9, 2024

Please forgive me @qweeah, I'm not sure I follow.

For my use case I just want to be able to pull and image and save it to disk, then be able to push it again to a different registry later. Is this being worked on and supported?

@qweeah
Copy link
Contributor Author

qweeah commented Oct 9, 2024

Please forgive me @qweeah, I'm not sure I follow.

For my use case I just want to be able to pull and image and save it to disk, then be able to push it again to a different registry later. Is this being worked on and supported?

@liamwh Yes, it is already supported. You can use oras cp with --to-oci-layout(pull) and --from-oci-layout(push)

> # pull an image to local folder
> oras cp ghcr.io/oras-project/oras:v1.2.0 --to-oci-layout test:v1.2.0
✓ Copied  application/vnd.oci.image.config.v1+json                                                        1.56/1.56 kB 100.00%  626µs
  └─ sha256:9cd577b9700fa49ac6b2b8eca69731494a6212c7c7fca50669601e8068acc420
...
Copied [registry] ghcr.io/oras-project/oras:v1.2.0 => [oci-layout] test:v1.2.0
Digest: sha256:0087224dd0decc354b5b0689068fbbc40cd5dc3dbf65fcb3868dfbd363dc790b

An OCI image layout folder test will be created and contains the pulled image tagged v1.2.0

> tree .
.
└── test
    ├── blobs
    │   └── sha256
    │       ├── 0087224dd0decc354b5b0689068fbbc40cd5dc3dbf65fcb3868dfbd363dc790b
    ...
    ├── index.json
    ├── ingest
    └── oci-layout

You can push the image from the folder to your own registry like:

> # push an image from local folder
> oras cp --from-oci-layout test:v1.2.0 localhost:5000/oras:v1.2.0
✓ Copied  application/vnd.oci.image.config.v1+json                                                        1.57/1.57 kB 100.00%   86ms
  └─ sha256:306409c919f25a0c7900c4610a925b53f6fb32a251c0ec81ab8b4381296b0cf3
...
  └─ sha256:0087224dd0decc354b5b0689068fbbc40cd5dc3dbf65fcb3868dfbd363dc790b
Copied [oci-layout] test:v1.2.0 => [registry] localhost:5000/oras:v1.2.0
Digest: sha256:0087224dd0decc354b5b0689068fbbc40cd5dc3dbf65fcb3868dfbd363dc790b

@liamwh
Copy link

liamwh commented Oct 9, 2024

Ah ok great, thank you 🙏

Is it then correct to assume that this is also supported from the Go SDK?

@liamwh
Copy link

liamwh commented Oct 9, 2024

And is it possible to save the file as a tar instead of unpacking it?

@qweeah
Copy link
Contributor Author

qweeah commented Oct 9, 2024

Saving(pulling) to a tar file is not supported, but reading(pushing) from a tar file is supported. You may tar the folder after pulling.

@liamwh
Copy link

liamwh commented Oct 9, 2024

Thanks for clarifying. Is it possible to save to a tar file instead of unpacking the contents to the file system?

@TerryHowe
Copy link
Member

Is it possible to save to a tar file instead of unpacking the contents to the file system?

No

@liamwh
Copy link

liamwh commented Oct 14, 2024

Please forgive my ignorance, I'm just trying to understand: why not skip the extraction and support just downloading the tar, given that's what an OCI image actually is?

@TerryHowe
Copy link
Member

Please forgive my ignorance, I'm just trying to understand: why not skip the extraction and support just downloading the tar, given that's what an OCI image actually is?

My understanding is that is exactly what this issue is about.

@qweeah
Copy link
Contributor Author

qweeah commented Oct 14, 2024

why not skip the extraction and support just downloading the tar, given that's what an OCI image actually is?

@liamwh Image layer files can be tarball and oras will not extract layer files.

However, the image itself, consisting of layer tarball files and other metadata, is not a tarball. The OCI layout folder won't be compressed by oras.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request spec required Issues that require specifications
Projects
None yet
Development

No branches or pull requests

5 participants