On Fri, Oct 27, 2023 at 11:26 AM Joshua Watt <jpewhac...@gmail.com> wrote:
>
> On Tue, Oct 24, 2023 at 12:58 PM Bruce Ashfield
> <bruce.ashfi...@gmail.com> wrote:
> >
> > On Mon, Oct 16, 2023 at 3:34 PM Joshua Watt <jpewhac...@gmail.com> wrote:
> > >
> > > On Mon, Oct 16, 2023 at 12:04 PM Bruce Ashfield
> > > <bruce.ashfi...@gmail.com> wrote:
> > > >
> > > > On Wed, Oct 4, 2023 at 10:54 AM Joshua Watt <jpewhac...@gmail.com> 
> > > > wrote:
> > > > >
> > > > > umoci treats the --image parameter as <DIRECTORY>:<NAME>, where the 
> > > > > OCI
> > > > > spec ref.name for the image it set to <NAME>. Therefore, if the
> > > > > intention is for the ref.name to be in the format <IMAGE_NAME>:<TAG> 
> > > > > (as
> > > > > is expected by e.g. `podman load`, then the complete argument that is
> > > > > passed to umoci must be `--image <DIRECTORY>:<IMAGE_NAME>:<TAG>`
> > > >
> > > > This is going to take a few iterations as well, the changing spec
> > > > and umoci uses have made this a non-trivial area to modify.
> > > >
> > > > I assume you are talking about the oci ref.name annotation ?
> > >
> > > Correct. If you pass <DIRECTORY>:<IMAGE_NAME>:<TAG> to umoci, ref.name
> > > will be <IMAGE_NAME>:<TAG>
> > >
> > > >
> > > > >
> > > > > Signed-off-by: Joshua Watt <jpewhac...@gmail.com>
> > > > > ---
> > > > >  classes/image-oci-umoci.inc | 52 
> > > > > +++++++++++++++++++------------------
> > > > >  1 file changed, 27 insertions(+), 25 deletions(-)
> > > > >
> > > > > diff --git a/classes/image-oci-umoci.inc b/classes/image-oci-umoci.inc
> > > > > index 58e4668..a58cb4c 100644
> > > > > --- a/classes/image-oci-umoci.inc
> > > > > +++ b/classes/image-oci-umoci.inc
> > > > > @@ -35,14 +35,16 @@ IMAGE_CMD:oci() {
> > > > >      fi
> > > > >
> > > > >      if [ -z "${OCI_IMAGE_TAG}" ]; then
> > > > > -       OCI_IMAGE_TAG="initial-tag"
> > > > > -    fi
> > > > > +       image_spec="$image_name:${IMAGE_BASENAME}:initial-tag"
> > > > > +    else
> > > > > +       image_spec="$image_name:${IMAGE_BASENAME}:${OCI_IMAGE_TAG}"
> > > >
> > > > I'm not seeing any examples in the umoci documentation that shows
> > > > a "triplet" of values for the image.
> > > >
> > > > It is always image-path[:image-tag] in what I've read and see in the 
> > > > source.
> > >
> > > Ya, I've noticed that. I think the reason for that is that ref.name
> > > being in the format "NAME:TAG" is a OCI convention that umoci doesn't
> > > _actually_ really need to care about. umoci cares about what directory
> > > the image is in (image-path) and what the ref.name should be set to
> > > (image-tag). Whether image-tag contains a ":" is irrelevant to umoci
> > > since it just copies whatever comes after the first ":" into ref.name.
> > >
> > > Importantly, image-path is never encoded in the JSON anywhere, so it's
> > > not equivalent to the container name.
> > >
> > > >
> > > > Are you saying that what is written into th oci spec json file should be
> > > > different ? and that encoding what you want in the image-path portion
> > > > of the umoci --image parameter makes it pass through correctly ?
> > >
> > > Ya. I can get containers that have a "nice" ref.name encoded in them by 
> > > doing:
> > >
> > > OCI_IMAGE_TAG = "$image_name:${IMAGE_BASENAME}:latest"
> > >
> > > Which then sets `ref.name = "${IMAGE_BASENAME}:latest"` and everything
> > > is happy with this. My suggestion is that the default behavior should
> > > be to encode a nice ref.name like this. Otherwise, tools can (and do)
> > > weird things when loading an OCI image. For example, in the current
> > > implementation, `podmain load -i <IMAGE>` will import the container
> > > _name_ as `latest`, then give it a `latest` tag since none was
> > > specified, so you end up with a `podman run localhost/latest:latest`
> > > which is just weird (and IMHO, a bad experience).
> >
> > Finally back to this.
> >
> > Can you send me a link to the spec you are reading ? Because from
> > what I've been reading; ref.name has no semantic restrictions within
> > the specified grammar. I just want to be sure that I'm not missing
> > something.
>
> The OCI spec doesn't really seem to concern itself with the concept of
> image labels (e.g. "latest") at all. It's silent on them, so this is
> just an emperical observation that behavior of importing images
> created by the oci classes is terrible, unless you use a tool that
> forces you to explicitly specify the destination name (like skopeo
> copy)

See below as to why your comment is on the mark :)

>
> >
> > I'm of course talking about: org.opencontainers.image.ref.name
> > and I'm using the oci image-spec repository.
>
> Yep
>
> >
> > That lack of semantics means we are just chasing whatever tools
> > have decided is their default, and there is no right choice IMHO.
>
> Maybe, but again, the default experience of `podman load`, which is
> IMHO the one we probably _really_ care about, is terrible.

meta-virt itself doesn't really dictate / anoint a preferred container
runtime / engine.  So I try and make sure that none of the experiences
are terrible, and have enough configuration options that we can
tweak things.

The starting of this development pre-dates podman, and was
focussed around sloci to create simple images without needing
any complex go applications as native / host tools.  It was those
images and being able to use the oci-image-tools + runc to
interrogate and execute the images without needing much of
a framework on top.

Then came docker and skopeo as the primary manipulators
of the images.

My tar'd up version of the oci directory was something I created
and then once a similar format was part of the spec, my structure
wasn't appropriate and I had to tweak it to keep tools happy
(which is why there are a couple of options for those oci image
directories).

>
> Based on the extra work the OCI class is doing to construct a
> directory name that looks like an image name, I had sort of assumed
> that it was trying (and failing) to encode the image name into the
> image so it would load nicely. Otherwise all the logic to construct
> the directory name could just be simplified to use a fixed name
> (like... "image") because the name of the directory has no affect on
> the name of the image. Maybe I'm reading too much into the tea leaves
> here :)

It is just a loose copy of the other image format naming conventions,
with additions that I thought would be useful when looking at a
jumbled deploy directory later :)

>
>
> >
> > It (ref.name) is most often just a tag (in the OCI examples), which is
> > why I was just setting it to the tag, and not containing the image
> > name in it at all, and also why I always check the variable to be
> > empty before assigning a simple default .. there's no way to get
> > it right for all consumers.
> >
> > Whatever is inheriting the class can tune it for the intended
> > container runtime. That being said, I'm ok with a bit more complexity
> > in the class to avoid everyone carrying more information than required
> > outside of the class.
> >
> > i.e. I don't really want to change the default, or more specifically force
> > the <image name>:<tag>, since with the proposed change, there's no
> > way to pass in an OCI_IMAGE_TAG and not have it somehow modified.
> > But I also don't need to compose some of the values each time, if there's
> > a single variable it is easier to override and make sure it is consistently
> > used (like your patch using the local variable image_spec).
> >
> > In this case, is something breaking if you make sure your tag is
> > encoded as "${IMAGE_BASENAME}:latest" before letting the image
> > class do its work ? From a glance, it will be consistently composed
> > as "$image_name:${IMAGE_BASENAME}:latest" and then passed
> > via --image.
>
> Ya, this works fine and I'll do that. Figured I'd at least make the
> case that the default is perhaps not particularly great.... It was
> really confusing to me (as a new person to meta-virt) why it was
> generating such bad names when I imported the images. If we don't
> change it, perhaps a least a warning against using `podman load` to
> load images in the README?

Maybe I can put some of the history and options for manipulating
the images in a README. I've captured a lot of it in my various
presentations over the years, but those aren't exactly accessible to
a user of the layer.

I'd still like to figure out a switch that you could set when including
the class, I've already added variables for the intended container
runtime for some of the other "distro/image" level features. I could
use them, and make the defaults sane based on that.

So I'll do the following:

- create a README with some details
- see if I can use the OCI variables I've added previously to set a default
- merge the : _ substitution patch, because regardless of the above, I
don't want the tools interpreting tags out of the names.

Bruce

>
> >
> > I'm building some oci-images now and having a look at the different
> > runtimes and copies of the images .. to see what happens with the
> > ref.name. and I'm going to experiment with some ways we can hint
> > about the format as an input.
> >
> > Bruce
> >
> >
> > >
> > > >
> > > > Bruce
> > > >
> > > > > +   fi
> > > > >
> > > > >      if [ -n "$new_image" ]; then
> > > > >         bbdebug 1 "OCI: umoci init --layout $image_name"
> > > > >         umoci init --layout $image_name
> > > > > -       umoci new --image $image_name:${OCI_IMAGE_TAG}
> > > > > -       umoci unpack --rootless --image $image_name:${OCI_IMAGE_TAG} 
> > > > > $image_bundle_name
> > > > > +       umoci new --image $image_spec
> > > > > +       umoci unpack --rootless --image $image_spec $image_bundle_name
> > > > >      else
> > > > >         # todo: create a different tag, after checking if the passed 
> > > > > one exists
> > > > >         true
> > > > > @@ -52,58 +54,58 @@ IMAGE_CMD:oci() {
> > > > >      bbdebug 1 "OCI: cp -r ${IMAGE_ROOTFS}/* 
> > > > > $image_bundle_name/rootfs/"
> > > > >      cp -r ${IMAGE_ROOTFS}/* $image_bundle_name/rootfs
> > > > >
> > > > > -    bbdebug 1 "OCI: umoci repack --image 
> > > > > $image_name:${OCI_IMAGE_TAG} $image_bundle_name"
> > > > > -    umoci repack --image $image_name:${OCI_IMAGE_TAG} 
> > > > > $image_bundle_name
> > > > > +    bbdebug 1 "OCI: umoci repack --image $image_spec 
> > > > > $image_bundle_name"
> > > > > +    umoci repack --image $image_spec $image_bundle_name
> > > > >
> > > > >      bbdebug 1 "OCI: configuring image"
> > > > >      if [ -n "${OCI_IMAGE_LABELS}" ]; then
> > > > >         for l in ${OCI_IMAGE_LABELS}; do
> > > > > -           bbdebug 1 "OCI: umoci config --image 
> > > > > $image_name:${OCI_IMAGE_TAG} --config.label $l"
> > > > > -           umoci config --image $image_name:${OCI_IMAGE_TAG} 
> > > > > --config.label $l
> > > > > +           bbdebug 1 "OCI: umoci config --image $image_spec 
> > > > > --config.label $l"
> > > > > +           umoci config --image $image_spec --config.label $l
> > > > >         done
> > > > >      fi
> > > > >      if [ -n "${OCI_IMAGE_ENV_VARS}" ]; then
> > > > >         for l in ${OCI_IMAGE_ENV_VARS}; do
> > > > > -           bbdebug 1 "umoci config --image 
> > > > > $image_name:${OCI_IMAGE_TAG} --config.env $l"
> > > > > -           umoci config --image $image_name:${OCI_IMAGE_TAG} 
> > > > > --config.env $l
> > > > > +           bbdebug 1 "umoci config --image $image_spec --config.env 
> > > > > $l"
> > > > > +           umoci config --image $image_spec --config.env $l
> > > > >         done
> > > > >      fi
> > > > >      if [ -n "${OCI_IMAGE_PORTS}" ]; then
> > > > >         for l in ${OCI_IMAGE_PORTS}; do
> > > > > -           bbdebug 1 "umoci config --image 
> > > > > $image_name:${OCI_IMAGE_TAG} --config.exposedports $l"
> > > > > -           umoci config --image $image_name:${OCI_IMAGE_TAG} 
> > > > > --config.exposedports $l
> > > > > +           bbdebug 1 "umoci config --image $image_spec 
> > > > > --config.exposedports $l"
> > > > > +           umoci config --image $image_spec --config.exposedports $l
> > > > >         done
> > > > >      fi
> > > > >      if [ -n "${OCI_IMAGE_RUNTIME_UID}" ]; then
> > > > > -       bbdebug 1 "umoci config --image $image_name:${OCI_IMAGE_TAG}  
> > > > > --config.user ${OCI_IMAGE_RUNTIME_UID}"
> > > > > -       umoci config --image $image_name:${OCI_IMAGE_TAG} 
> > > > > --config.user ${OCI_IMAGE_RUNTIME_UID}
> > > > > +       bbdebug 1 "umoci config --image $image_spec  --config.user 
> > > > > ${OCI_IMAGE_RUNTIME_UID}"
> > > > > +       umoci config --image $image_spec --config.user 
> > > > > ${OCI_IMAGE_RUNTIME_UID}
> > > > >      fi
> > > > >      if [ -n "${OCI_IMAGE_WORKINGDIR}" ]; then
> > > > > -       bbdebug 1 "umoci config --image $image_name:${OCI_IMAGE_TAG}  
> > > > > --config.workingdir ${OCI_IMAGE_WORKINGDIR}"
> > > > > -       umoci config --image $image_name:${OCI_IMAGE_TAG} 
> > > > > --config.workingdir ${OCI_IMAGE_WORKINGDIR}
> > > > > +       bbdebug 1 "umoci config --image $image_spec  
> > > > > --config.workingdir ${OCI_IMAGE_WORKINGDIR}"
> > > > > +       umoci config --image $image_spec --config.workingdir 
> > > > > ${OCI_IMAGE_WORKINGDIR}
> > > > >      fi
> > > > >      if [ -n "${OCI_IMAGE_STOPSIGNAL}" ]; then
> > > > > -       bbdebug 1 "umoci config --image $image_name:${OCI_IMAGE_TAG}  
> > > > > --config.stopsignal ${OCI_IMAGE_STOPSIGNAL}"
> > > > > -       umoci config --image $image_name:${OCI_IMAGE_TAG} 
> > > > > --config.stopsignal ${OCI_IMAGE_STOPSIGNAL}
> > > > > +       bbdebug 1 "umoci config --image $image_spec  
> > > > > --config.stopsignal ${OCI_IMAGE_STOPSIGNAL}"
> > > > > +       umoci config --image $image_spec --config.stopsignal 
> > > > > ${OCI_IMAGE_STOPSIGNAL}
> > > > >      fi
> > > > >      if [ -n "${OCI_IMAGE_OS}" ]; then
> > > > > -       bbdebug 1 "umoci config --image $image_name:${OCI_IMAGE_TAG}  
> > > > > --os ${OCI_IMAGE_OS}"
> > > > > -       umoci config --image $image_name:${OCI_IMAGE_TAG} --os 
> > > > > ${OCI_IMAGE_OS}
> > > > > +       bbdebug 1 "umoci config --image $image_spec  --os 
> > > > > ${OCI_IMAGE_OS}"
> > > > > +       umoci config --image $image_spec --os ${OCI_IMAGE_OS}
> > > > >      fi
> > > > >
> > > > > -    bbdebug 1 "umoci config --image $image_name:${OCI_IMAGE_TAG}  
> > > > > --architecture ${OCI_IMAGE_ARCH}"
> > > > > -    umoci config --image $image_name:${OCI_IMAGE_TAG} --architecture 
> > > > > ${OCI_IMAGE_ARCH}
> > > > > +    bbdebug 1 "umoci config --image $image_spec  --architecture 
> > > > > ${OCI_IMAGE_ARCH}"
> > > > > +    umoci config --image $image_spec --architecture ${OCI_IMAGE_ARCH}
> > > > >      # NOTE: umoci doesn't currently expose setting the architecture 
> > > > > variant,
> > > > >      #       so if you need it use sloci instead
> > > > >      if [ -n "${OCI_IMAGE_SUBARCH}" ]; then
> > > > >         bbnote "OCI: image subarch is set to: ${OCI_IMAGE_SUBARCH}, 
> > > > > but umoci does not"
> > > > >         bbnote "     expose variants. use sloci instead if this is 
> > > > > important"
> > > > >      fi
> > > > > -    umoci config --image $image_name:${OCI_IMAGE_TAG} 
> > > > > --config.entrypoint ${OCI_IMAGE_ENTRYPOINT}
> > > > > +    umoci config --image $image_spec --config.entrypoint 
> > > > > ${OCI_IMAGE_ENTRYPOINT}
> > > > >      if [ -n "${OCI_IMAGE_ENTRYPOINT_ARGS}" ]; then
> > > > > -       umoci config --image $image_name:${OCI_IMAGE_TAG} 
> > > > > --config.cmd "${OCI_IMAGE_ENTRYPOINT_ARGS}"
> > > > > +       umoci config --image $image_spec --config.cmd 
> > > > > "${OCI_IMAGE_ENTRYPOINT_ARGS}"
> > > > >      fi
> > > > > -    umoci config --image $image_name:${OCI_IMAGE_TAG} --author 
> > > > > ${OCI_IMAGE_AUTHOR_EMAIL}
> > > > > +    umoci config --image $image_spec --author 
> > > > > ${OCI_IMAGE_AUTHOR_EMAIL}
> > > > >
> > > > >      # make a tar version of the image direcotry
> > > > >      #  1) image_name.tar: compatible with oci tar format, blobs and 
> > > > > rootfs
> > > > > --
> > > > > 2.34.1
> > > > >
> > > > >
> > > > > 
> > > > >
> > > >
> > > >
> > > > --
> > > > - Thou shalt not follow the NULL pointer, for chaos and madness await
> > > > thee at its end
> > > > - "Use the force Harry" - Gandalf, Star Trek II
> >
> >
> >
> > --
> > - Thou shalt not follow the NULL pointer, for chaos and madness await
> > thee at its end
> > - "Use the force Harry" - Gandalf, Star Trek II



-- 
- Thou shalt not follow the NULL pointer, for chaos and madness await
thee at its end
- "Use the force Harry" - Gandalf, Star Trek II
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#8405): 
https://lists.yoctoproject.org/g/meta-virtualization/message/8405
Mute This Topic: https://lists.yoctoproject.org/mt/101756743/21656
Group Owner: meta-virtualization+ow...@lists.yoctoproject.org
Unsubscribe: 
https://lists.yoctoproject.org/g/meta-virtualization/leave/6693005/21656/1014668956/xyzzy
 [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to