nix build .#hydraJobs.dockerImage.x86_64-linux.tarball is down #1152

Closed
opened 2026-03-10 18:14:09 +00:00 by jade · 1 comment
Owner

Apply: https://gerrit.lix.systems/c/lix/+/5362/1
Then: nix build .#hydraJobs.dockerImage.x86_64-linux.tarball.

skopeo> Running phase: unpackPhase
nix2container> Running phase: unpackPhase
nix2container> unpacking source archive /nix/store/pvzx38dk2cs63rgg6fwc63jczkizrgrs-source
nix2container> source root is source
nix2container> Running phase: patchPhase
nix2container> Running phase: updateAutotoolsGnuConfigScriptsPhase
nix2container> Running phase: configurePhase
skopeo> unpacking source archive /nix/store/pdxs915naz6n5q9x5y0xx1lhb2rp0yp5-source
nix2container> Running phase: buildPhase
skopeo> source root is source
skopeo> Running phase: patchPhase
skopeo> Running phase: updateAutotoolsGnuConfigScriptsPhase
skopeo> Running phase: configurePhase
skopeo> Running phase: buildPhase
skopeo> diff --git a/image/transports/alltransports/alltransports.go b/image/transports/alltransports/alltransports.go
skopeo> --- a/image/transports/alltransports/alltransports.go
skopeo> +++ b/image/transports/alltransports/alltransports.go
skopeo> @@ -18,6 +18,7 @@
skopeo>         _ "go.podman.io/image/v5/openshift"
skopeo>         _ "go.podman.io/image/v5/sif"
skopeo>         _ "go.podman.io/image/v5/tarball"
skopeo> +       _ "go.podman.io/image/v5/nix"
skopeo>         // The docker-daemon transport is registeredy by docker_daemon*.go
skopeo>         // The storage transport is registered by storage*.go
skopeo>  )
skopeo> --- /dev/null
skopeo> +++ b/image/nix/transport.go
skopeo> @@ -0,0 +1,206 @@
skopeo> +package nix
skopeo> +
skopeo> +import (
skopeo> +       "context"
skopeo> +       "encoding/json"
skopeo> +       "fmt"
skopeo> +       "go.podman.io/image/v5/docker/reference"
skopeo> +       "go.podman.io/image/v5/image"
skopeo> +       "go.podman.io/image/v5/manifest"
skopeo> +       "go.podman.io/image/v5/transports"
skopeo> +       "go.podman.io/image/v5/types"
skopeo> +       "github.com/nlewo/nix2container/nix"
skopeo> +       nixtypes "github.com/nlewo/nix2container/types"
skopeo> +       digest "github.com/opencontainers/go-digest"
skopeo> +       imgspecv1 "github.com/opencontainers/image-spec/specs-go/v1"
skopeo> +       "github.com/pkg/errors"
skopeo> +       "io"
skopeo> +)
skopeo> +
skopeo> +func init() {
skopeo> +       transports.Register(Transport)
skopeo> +}
skopeo> +
skopeo> +// Transport is an ImageTransport for nix2container JSON image specification.
skopeo> +var Transport = nixTransport{}
skopeo> +
skopeo> +type nixTransport struct{}
skopeo> +
skopeo> +func (t nixTransport) Name() string {
skopeo> +       return "nix"
skopeo> +}
skopeo> +
skopeo> +type nixReference struct {
skopeo> +       path     string
skopeo> +       nixImage nixtypes.Image
skopeo> +}
skopeo> +
skopeo> +// ParseReference converts a string, which should not start with the ImageTransport.Name prefix, into an ImageReference.
skopeo> +func (t nixTransport) ParseReference(reference string) (types.ImageReference, error) {
skopeo> +       nixImage, err := nix.NewImageFromFile(reference)
skopeo> +       if err != nil {
skopeo> +               return nil, err
skopeo> +       }
skopeo> +       imageReference := nixReference{
skopeo> +               path:     reference,
skopeo> +               nixImage: nixImage,
skopeo> +       }
skopeo> +       return imageReference, nil
skopeo> +}
skopeo> +
skopeo> +// ValidatePolicyConfigurationScope checks that scope is a valid name for a signature.PolicyTransportScopes keys
skopeo> +// (i.e. a valid PolicyConfigurationIdentity() or PolicyConfigurationNamespaces() return value).
skopeo> +// It is acceptable to allow an invalid value which will never be matched, it can "only" cause user confusion.
skopeo> +// scope passed to this function will not be "", that value is always allowed.
skopeo> +func (t nixTransport) ValidatePolicyConfigurationScope(scope string) error {
skopeo> +       // See the explanation in archiveReference.PolicyConfigurationIdentity.
skopeo> +       return errors.New(`nix: does not support any scopes except the default "" one`)
skopeo> +}
skopeo> +
skopeo> +// StringWithinTransport returns a string representation of the reference, which MUST be such that
skopeo> +// reference.Transport().ParseReference(reference.StringWithinTransport()) returns an equivalent reference.
skopeo> +func (ref nixReference) StringWithinTransport() string {
skopeo> +       return fmt.Sprintf("%s", ref.path)
skopeo> +}
skopeo> +
skopeo> +func (ref nixReference) Transport() types.ImageTransport {
skopeo> +       return Transport
skopeo> +}
skopeo> +
skopeo> +// DeleteImage deletes the named image from the registry, if supported.
skopeo> +func (ref nixReference) DeleteImage(ctx context.Context, sys *types.SystemContext) error {
skopeo> +       return errors.New("Deleting images not implemented for nix: images")
skopeo> +}
skopeo> +
skopeo> +// DockerReference returns a Docker reference associated with this reference
skopeo> +// (fully explicit, i.e. !reference.IsNameOnly, but reflecting user intent,
skopeo> +// not e.g. after redirect or alias processing), or nil if unknown/not applicable.
skopeo> +func (ref nixReference) DockerReference() reference.Named {
skopeo> +       return nil
skopeo> +}
skopeo> +
skopeo> +// NewImage returns a types.ImageCloser for this reference, possibly specialized for this ImageTransport.
skopeo> +// The caller must call .Close() on the returned ImageCloser.
skopeo> +// NOTE: If any kind of signature verification should happen, build an UnparsedImage from the value returned by NewImageSource,
skopeo> +// verify that UnparsedImage, and convert it into a real Image via image.FromUnparsedImage.
skopeo> +// WARNING: This may not do the right thing for a manifest list, see image.FromSource for details.
skopeo> +func (ref nixReference) NewImage(ctx context.Context, sys *types.SystemContext) (types.ImageCloser, error) {
skopeo> +       src, err := newImageSource(ctx, sys, ref)
skopeo> +       if err != nil {
skopeo> +               return nil, err
skopeo> +       }
skopeo> +       return image.FromSource(ctx, sys, src)
skopeo> +}
skopeo> +
skopeo> +// NewImageSource returns a types.ImageSource for this reference.
skopeo> +// The caller must call .Close() on the returned ImageSource.
skopeo> +func (ref nixReference) NewImageSource(ctx context.Context, sys *types.SystemContext) (types.ImageSource, error) {
skopeo> +       return newImageSource(ctx, sys, ref)
skopeo> +}
skopeo> +
skopeo> +// PolicyConfigurationIdentity returns a string representation of the reference, suitable for policy lookup.
skopeo> +func (ref nixReference) PolicyConfigurationIdentity() string {
skopeo> +       return ""
skopeo> +}
skopeo> +
skopeo> +// PolicyConfigurationNamespaces returns a list of other policy configuration namespaces to search
skopeo> +// for if explicit configuration for PolicyConfigurationIdentity() is not set
skopeo> +func (ref nixReference) PolicyConfigurationNamespaces() []string {
skopeo> +       return []string{}
skopeo> +}
skopeo> +
skopeo> +// NewImageDestination returns a types.ImageDestination for this reference.
skopeo> +// The caller must call .Close() on the returned ImageDestination.
skopeo> +func (ref nixReference) NewImageDestination(ctx context.Context, sys *types.SystemContext) (types.ImageDestination, error) {
skopeo> +       return nil, errors.New("It is not possible to copy to nix: images")
skopeo> +}
skopeo> +
skopeo> +// newImageSource returns an ImageSource for reading from an existing directory.
skopeo> +// newImageSource untars the file and saves it in a temp directory
skopeo> +func newImageSource(ctx context.Context, sys *types.SystemContext, ref nixReference) (types.ImageSource, error) {
skopeo> +       return &nixImageSource{
skopeo> +               ref: ref,
skopeo> +       }, nil
skopeo> +}
skopeo> +
skopeo> +type nixImageSource struct {
skopeo> +       ref nixReference
skopeo> +}
skopeo> +
skopeo> +// Close removes resources associated with an initialized ImageSource, if any.
skopeo> +// Close deletes the temporary directory at dst
skopeo> +func (s *nixImageSource) Close() error {
skopeo> +       return nil
skopeo> +}
skopeo> +
skopeo> +func (s *nixImageSource) GetBlob(ctx context.Context, info types.BlobInfo, cache types.BlobInfoCache) (io.ReadCloser, int64, error) {
skopeo> +       // TODO: returning the blob size here leads to the following error on image copy:
skopeo> +       // FATA[0000] writing blob: archive/tar: write too long
skopeo> +       rc, _, err := nix.GetBlob(s.ref.nixImage, info.Digest)
skopeo> +       return rc, -1, err
skopeo> +}
skopeo> +
skopeo> +// GetManifest returns the image's manifest along with its MIME type (which may be empty when it can't be determined but the manifest i
s available).
skopeo> +// It may use a remote (= slow) service.
skopeo> +// If instanceDigest is not nil, it contains a digest of the specific manifest instance to retrieve (when the primary manifest is a man
ifest list);
skopeo> +// this never happens if the primary manifest is not a manifest list (e.g. if the source never returns manifest lists).
skopeo> +func (s *nixImageSource) GetManifest(ctx context.Context, instanceDigest *digest.Digest) ([]byte, string, error) {
skopeo> +       configDigest, size, err := nix.GetConfigDigest(s.ref.nixImage)
skopeo> +       if err != nil {
skopeo> +               return nil, "", err
skopeo> +       }
skopeo> +       config := imgspecv1.Descriptor{
skopeo> +               MediaType: imgspecv1.MediaTypeImageConfig,
skopeo> +               Size:      size,
skopeo> +               Digest:    configDigest,
skopeo> +       }
skopeo> +
skopeo> +       var layers []imgspecv1.Descriptor
skopeo> +       for _, layer := range s.ref.nixImage.Layers {
skopeo> +               digest, err := digest.Parse(layer.Digest)
skopeo> +               if err != nil {
skopeo> +                       return nil, "", err
skopeo> +               }
skopeo> +               layers = append(layers, imgspecv1.Descriptor{
skopeo> +                       MediaType: layer.MediaType,
skopeo> +                       Size:      layer.Size,
skopeo> +                       Digest:    digest,
skopeo> +               })
skopeo> +       }
skopeo> +
skopeo> +       m := manifest.OCI1FromComponents(
skopeo> +               config,
skopeo> +               layers,
skopeo> +       )
skopeo> +       manifestBytes, err := json.Marshal(&m)
skopeo> +       if err != nil {
skopeo> +               return nil, "", err
skopeo> +       }
skopeo> +       return manifestBytes, imgspecv1.MediaTypeImageManifest, nil
skopeo> +}
skopeo> +
skopeo> +func (s *nixImageSource) GetSignatures(ctx context.Context, instanceDigest *digest.Digest) ([][]byte, error) {
skopeo> +       return [][]byte{}, nil
skopeo> +}
skopeo> +
skopeo> +// HasThreadSafeGetBlob indicates whether GetBlob can be executed concurrently.
skopeo> +func (s *nixImageSource) HasThreadSafeGetBlob() bool {
skopeo> +       return true
skopeo> +}
skopeo> +
skopeo> +// LayerInfosForCopy returns either nil (meaning the values in the manifest are fine), or updated values for the layer
skopeo> +// blobsums that are listed in the image's manifest.  If values are returned, they should be used when using GetBlob()
skopeo> +// to read the image's layers.
skopeo> +// If instanceDigest is not nil, it contains a digest of the specific manifest instance to retrieve BlobInfos for
skopeo> +// (when the primary manifest is a manifest list); this never happens if the primary manifest is not a manifest list
skopeo> +// (e.g. if the source never returns manifest lists).
skopeo> +// The Digest field is guaranteed to be provided; Size may be -1.
skopeo> +// WARNING: The list may contain duplicates, and they are semantically relevant.
skopeo> +func (s *nixImageSource) LayerInfosForCopy(ctx context.Context, instanceDigest *digest.Digest) ([]types.BlobInfo, error) {
skopeo> +       return nil, nil
skopeo> +}
skopeo> +
skopeo> +// Reference returns the reference used to set up this source.
skopeo> +func (s *nixImageSource) Reference() types.ImageReference {
skopeo> +       return s.ref
skopeo> +}
skopeo> /nix/store/43dbh9z6v997g6njz4yqmcrj26zic9ds-stdenv-linux/setup: line 262: cd: vendor/go.podman.io/image/v5: No such file or directory
error: build of '/nix/store/6zyqipar1ywgj28bh5m5pp4y73p1cdzw-skopeo-1.20.0.drv' on 'ssh-ng://nix-remote-build@redacted' failed: builder for 
'/nix/store/6zyqipar1ywgj28bh5m5pp4y73p1cdzw-skopeo-1.20.0.drv' failed with exit code 1;
       last 25 log lines:
       > +   return [][]byte{}, nil
       > +}
       > +
       > +// HasThreadSafeGetBlob indicates whether GetBlob can be executed concurrently.
       > +func (s *nixImageSource) HasThreadSafeGetBlob() bool {
       > +     return true
       > +}
       > +
       > +// LayerInfosForCopy returns either nil (meaning the values in the manifest are fine), or updated values for the layer
       > +// blobsums that are listed in the image's manifest.  If values are returned, they should be used when using GetBlob()
       > +// to read the image's layers.
       > +// If instanceDigest is not nil, it contains a digest of the specific manifest instance to retrieve BlobInfos for
       > +// (when the primary manifest is a manifest list); this never happens if the primary manifest is not a manifest list
       > +// (e.g. if the source never returns manifest lists).
       > +// The Digest field is guaranteed to be provided; Size may be -1.
       > +// WARNING: The list may contain duplicates, and they are semantically relevant.
       > +func (s *nixImageSource) LayerInfosForCopy(ctx context.Context, instanceDigest *digest.Digest) ([]types.BlobInfo, error) {
       > + return nil, nil
       > +}
       > +
       > +// Reference returns the reference used to set up this source.
       > +func (s *nixImageSource) Reference() types.ImageReference {
       > +        return s.ref
       > +}
       > /nix/store/43dbh9z6v997g6njz4yqmcrj26zic9ds-stdenv-linux/setup: line 262: cd: vendor/go.podman.io/image/v5: No such file or directory
       For full logs, run:
             nix log /nix/store/6zyqipar1ywgj28bh5m5pp4y73p1cdzw-skopeo-1.20.0.drv
error: builder for '/nix/store/6zyqipar1ywgj28bh5m5pp4y73p1cdzw-skopeo-1.20.0.drv' failed on remote builder
error: 1 dependencies of derivation '/nix/store/imqyjwynbp4f6pfxhnpsz8y6bjj789iq-copy-to.drv' failed to build
error: 1 dependencies of derivation '/nix/store/6n7cxyb1xim11i6zcpyla910dlf2mrwm-docker-image-tarball-2.95.0pre20260310-dev_7ec9f1f.drv' failed 

I will go figure this out.

Apply: https://gerrit.lix.systems/c/lix/+/5362/1 Then: `nix build .#hydraJobs.dockerImage.x86_64-linux.tarball`. ``` skopeo> Running phase: unpackPhase nix2container> Running phase: unpackPhase nix2container> unpacking source archive /nix/store/pvzx38dk2cs63rgg6fwc63jczkizrgrs-source nix2container> source root is source nix2container> Running phase: patchPhase nix2container> Running phase: updateAutotoolsGnuConfigScriptsPhase nix2container> Running phase: configurePhase skopeo> unpacking source archive /nix/store/pdxs915naz6n5q9x5y0xx1lhb2rp0yp5-source nix2container> Running phase: buildPhase skopeo> source root is source skopeo> Running phase: patchPhase skopeo> Running phase: updateAutotoolsGnuConfigScriptsPhase skopeo> Running phase: configurePhase skopeo> Running phase: buildPhase skopeo> diff --git a/image/transports/alltransports/alltransports.go b/image/transports/alltransports/alltransports.go skopeo> --- a/image/transports/alltransports/alltransports.go skopeo> +++ b/image/transports/alltransports/alltransports.go skopeo> @@ -18,6 +18,7 @@ skopeo> _ "go.podman.io/image/v5/openshift" skopeo> _ "go.podman.io/image/v5/sif" skopeo> _ "go.podman.io/image/v5/tarball" skopeo> + _ "go.podman.io/image/v5/nix" skopeo> // The docker-daemon transport is registeredy by docker_daemon*.go skopeo> // The storage transport is registered by storage*.go skopeo> ) skopeo> --- /dev/null skopeo> +++ b/image/nix/transport.go skopeo> @@ -0,0 +1,206 @@ skopeo> +package nix skopeo> + skopeo> +import ( skopeo> + "context" skopeo> + "encoding/json" skopeo> + "fmt" skopeo> + "go.podman.io/image/v5/docker/reference" skopeo> + "go.podman.io/image/v5/image" skopeo> + "go.podman.io/image/v5/manifest" skopeo> + "go.podman.io/image/v5/transports" skopeo> + "go.podman.io/image/v5/types" skopeo> + "github.com/nlewo/nix2container/nix" skopeo> + nixtypes "github.com/nlewo/nix2container/types" skopeo> + digest "github.com/opencontainers/go-digest" skopeo> + imgspecv1 "github.com/opencontainers/image-spec/specs-go/v1" skopeo> + "github.com/pkg/errors" skopeo> + "io" skopeo> +) skopeo> + skopeo> +func init() { skopeo> + transports.Register(Transport) skopeo> +} skopeo> + skopeo> +// Transport is an ImageTransport for nix2container JSON image specification. skopeo> +var Transport = nixTransport{} skopeo> + skopeo> +type nixTransport struct{} skopeo> + skopeo> +func (t nixTransport) Name() string { skopeo> + return "nix" skopeo> +} skopeo> + skopeo> +type nixReference struct { skopeo> + path string skopeo> + nixImage nixtypes.Image skopeo> +} skopeo> + skopeo> +// ParseReference converts a string, which should not start with the ImageTransport.Name prefix, into an ImageReference. skopeo> +func (t nixTransport) ParseReference(reference string) (types.ImageReference, error) { skopeo> + nixImage, err := nix.NewImageFromFile(reference) skopeo> + if err != nil { skopeo> + return nil, err skopeo> + } skopeo> + imageReference := nixReference{ skopeo> + path: reference, skopeo> + nixImage: nixImage, skopeo> + } skopeo> + return imageReference, nil skopeo> +} skopeo> + skopeo> +// ValidatePolicyConfigurationScope checks that scope is a valid name for a signature.PolicyTransportScopes keys skopeo> +// (i.e. a valid PolicyConfigurationIdentity() or PolicyConfigurationNamespaces() return value). skopeo> +// It is acceptable to allow an invalid value which will never be matched, it can "only" cause user confusion. skopeo> +// scope passed to this function will not be "", that value is always allowed. skopeo> +func (t nixTransport) ValidatePolicyConfigurationScope(scope string) error { skopeo> + // See the explanation in archiveReference.PolicyConfigurationIdentity. skopeo> + return errors.New(`nix: does not support any scopes except the default "" one`) skopeo> +} skopeo> + skopeo> +// StringWithinTransport returns a string representation of the reference, which MUST be such that skopeo> +// reference.Transport().ParseReference(reference.StringWithinTransport()) returns an equivalent reference. skopeo> +func (ref nixReference) StringWithinTransport() string { skopeo> + return fmt.Sprintf("%s", ref.path) skopeo> +} skopeo> + skopeo> +func (ref nixReference) Transport() types.ImageTransport { skopeo> + return Transport skopeo> +} skopeo> + skopeo> +// DeleteImage deletes the named image from the registry, if supported. skopeo> +func (ref nixReference) DeleteImage(ctx context.Context, sys *types.SystemContext) error { skopeo> + return errors.New("Deleting images not implemented for nix: images") skopeo> +} skopeo> + skopeo> +// DockerReference returns a Docker reference associated with this reference skopeo> +// (fully explicit, i.e. !reference.IsNameOnly, but reflecting user intent, skopeo> +// not e.g. after redirect or alias processing), or nil if unknown/not applicable. skopeo> +func (ref nixReference) DockerReference() reference.Named { skopeo> + return nil skopeo> +} skopeo> + skopeo> +// NewImage returns a types.ImageCloser for this reference, possibly specialized for this ImageTransport. skopeo> +// The caller must call .Close() on the returned ImageCloser. skopeo> +// NOTE: If any kind of signature verification should happen, build an UnparsedImage from the value returned by NewImageSource, skopeo> +// verify that UnparsedImage, and convert it into a real Image via image.FromUnparsedImage. skopeo> +// WARNING: This may not do the right thing for a manifest list, see image.FromSource for details. skopeo> +func (ref nixReference) NewImage(ctx context.Context, sys *types.SystemContext) (types.ImageCloser, error) { skopeo> + src, err := newImageSource(ctx, sys, ref) skopeo> + if err != nil { skopeo> + return nil, err skopeo> + } skopeo> + return image.FromSource(ctx, sys, src) skopeo> +} skopeo> + skopeo> +// NewImageSource returns a types.ImageSource for this reference. skopeo> +// The caller must call .Close() on the returned ImageSource. skopeo> +func (ref nixReference) NewImageSource(ctx context.Context, sys *types.SystemContext) (types.ImageSource, error) { skopeo> + return newImageSource(ctx, sys, ref) skopeo> +} skopeo> + skopeo> +// PolicyConfigurationIdentity returns a string representation of the reference, suitable for policy lookup. skopeo> +func (ref nixReference) PolicyConfigurationIdentity() string { skopeo> + return "" skopeo> +} skopeo> + skopeo> +// PolicyConfigurationNamespaces returns a list of other policy configuration namespaces to search skopeo> +// for if explicit configuration for PolicyConfigurationIdentity() is not set skopeo> +func (ref nixReference) PolicyConfigurationNamespaces() []string { skopeo> + return []string{} skopeo> +} skopeo> + skopeo> +// NewImageDestination returns a types.ImageDestination for this reference. skopeo> +// The caller must call .Close() on the returned ImageDestination. skopeo> +func (ref nixReference) NewImageDestination(ctx context.Context, sys *types.SystemContext) (types.ImageDestination, error) { skopeo> + return nil, errors.New("It is not possible to copy to nix: images") skopeo> +} skopeo> + skopeo> +// newImageSource returns an ImageSource for reading from an existing directory. skopeo> +// newImageSource untars the file and saves it in a temp directory skopeo> +func newImageSource(ctx context.Context, sys *types.SystemContext, ref nixReference) (types.ImageSource, error) { skopeo> + return &nixImageSource{ skopeo> + ref: ref, skopeo> + }, nil skopeo> +} skopeo> + skopeo> +type nixImageSource struct { skopeo> + ref nixReference skopeo> +} skopeo> + skopeo> +// Close removes resources associated with an initialized ImageSource, if any. skopeo> +// Close deletes the temporary directory at dst skopeo> +func (s *nixImageSource) Close() error { skopeo> + return nil skopeo> +} skopeo> + skopeo> +func (s *nixImageSource) GetBlob(ctx context.Context, info types.BlobInfo, cache types.BlobInfoCache) (io.ReadCloser, int64, error) { skopeo> + // TODO: returning the blob size here leads to the following error on image copy: skopeo> + // FATA[0000] writing blob: archive/tar: write too long skopeo> + rc, _, err := nix.GetBlob(s.ref.nixImage, info.Digest) skopeo> + return rc, -1, err skopeo> +} skopeo> + skopeo> +// GetManifest returns the image's manifest along with its MIME type (which may be empty when it can't be determined but the manifest i s available). skopeo> +// It may use a remote (= slow) service. skopeo> +// If instanceDigest is not nil, it contains a digest of the specific manifest instance to retrieve (when the primary manifest is a man ifest list); skopeo> +// this never happens if the primary manifest is not a manifest list (e.g. if the source never returns manifest lists). skopeo> +func (s *nixImageSource) GetManifest(ctx context.Context, instanceDigest *digest.Digest) ([]byte, string, error) { skopeo> + configDigest, size, err := nix.GetConfigDigest(s.ref.nixImage) skopeo> + if err != nil { skopeo> + return nil, "", err skopeo> + } skopeo> + config := imgspecv1.Descriptor{ skopeo> + MediaType: imgspecv1.MediaTypeImageConfig, skopeo> + Size: size, skopeo> + Digest: configDigest, skopeo> + } skopeo> + skopeo> + var layers []imgspecv1.Descriptor skopeo> + for _, layer := range s.ref.nixImage.Layers { skopeo> + digest, err := digest.Parse(layer.Digest) skopeo> + if err != nil { skopeo> + return nil, "", err skopeo> + } skopeo> + layers = append(layers, imgspecv1.Descriptor{ skopeo> + MediaType: layer.MediaType, skopeo> + Size: layer.Size, skopeo> + Digest: digest, skopeo> + }) skopeo> + } skopeo> + skopeo> + m := manifest.OCI1FromComponents( skopeo> + config, skopeo> + layers, skopeo> + ) skopeo> + manifestBytes, err := json.Marshal(&m) skopeo> + if err != nil { skopeo> + return nil, "", err skopeo> + } skopeo> + return manifestBytes, imgspecv1.MediaTypeImageManifest, nil skopeo> +} skopeo> + skopeo> +func (s *nixImageSource) GetSignatures(ctx context.Context, instanceDigest *digest.Digest) ([][]byte, error) { skopeo> + return [][]byte{}, nil skopeo> +} skopeo> + skopeo> +// HasThreadSafeGetBlob indicates whether GetBlob can be executed concurrently. skopeo> +func (s *nixImageSource) HasThreadSafeGetBlob() bool { skopeo> + return true skopeo> +} skopeo> + skopeo> +// LayerInfosForCopy returns either nil (meaning the values in the manifest are fine), or updated values for the layer skopeo> +// blobsums that are listed in the image's manifest. If values are returned, they should be used when using GetBlob() skopeo> +// to read the image's layers. skopeo> +// If instanceDigest is not nil, it contains a digest of the specific manifest instance to retrieve BlobInfos for skopeo> +// (when the primary manifest is a manifest list); this never happens if the primary manifest is not a manifest list skopeo> +// (e.g. if the source never returns manifest lists). skopeo> +// The Digest field is guaranteed to be provided; Size may be -1. skopeo> +// WARNING: The list may contain duplicates, and they are semantically relevant. skopeo> +func (s *nixImageSource) LayerInfosForCopy(ctx context.Context, instanceDigest *digest.Digest) ([]types.BlobInfo, error) { skopeo> + return nil, nil skopeo> +} skopeo> + skopeo> +// Reference returns the reference used to set up this source. skopeo> +func (s *nixImageSource) Reference() types.ImageReference { skopeo> + return s.ref skopeo> +} skopeo> /nix/store/43dbh9z6v997g6njz4yqmcrj26zic9ds-stdenv-linux/setup: line 262: cd: vendor/go.podman.io/image/v5: No such file or directory error: build of '/nix/store/6zyqipar1ywgj28bh5m5pp4y73p1cdzw-skopeo-1.20.0.drv' on 'ssh-ng://nix-remote-build@redacted' failed: builder for '/nix/store/6zyqipar1ywgj28bh5m5pp4y73p1cdzw-skopeo-1.20.0.drv' failed with exit code 1; last 25 log lines: > + return [][]byte{}, nil > +} > + > +// HasThreadSafeGetBlob indicates whether GetBlob can be executed concurrently. > +func (s *nixImageSource) HasThreadSafeGetBlob() bool { > + return true > +} > + > +// LayerInfosForCopy returns either nil (meaning the values in the manifest are fine), or updated values for the layer > +// blobsums that are listed in the image's manifest. If values are returned, they should be used when using GetBlob() > +// to read the image's layers. > +// If instanceDigest is not nil, it contains a digest of the specific manifest instance to retrieve BlobInfos for > +// (when the primary manifest is a manifest list); this never happens if the primary manifest is not a manifest list > +// (e.g. if the source never returns manifest lists). > +// The Digest field is guaranteed to be provided; Size may be -1. > +// WARNING: The list may contain duplicates, and they are semantically relevant. > +func (s *nixImageSource) LayerInfosForCopy(ctx context.Context, instanceDigest *digest.Digest) ([]types.BlobInfo, error) { > + return nil, nil > +} > + > +// Reference returns the reference used to set up this source. > +func (s *nixImageSource) Reference() types.ImageReference { > + return s.ref > +} > /nix/store/43dbh9z6v997g6njz4yqmcrj26zic9ds-stdenv-linux/setup: line 262: cd: vendor/go.podman.io/image/v5: No such file or directory For full logs, run: nix log /nix/store/6zyqipar1ywgj28bh5m5pp4y73p1cdzw-skopeo-1.20.0.drv error: builder for '/nix/store/6zyqipar1ywgj28bh5m5pp4y73p1cdzw-skopeo-1.20.0.drv' failed on remote builder error: 1 dependencies of derivation '/nix/store/imqyjwynbp4f6pfxhnpsz8y6bjj789iq-copy-to.drv' failed to build error: 1 dependencies of derivation '/nix/store/6n7cxyb1xim11i6zcpyla910dlf2mrwm-docker-image-tarball-2.95.0pre20260310-dev_7ec9f1f.drv' failed ``` I will go figure this out.
jade added this to the 2.95 milestone 2026-03-10 18:14:09 +00:00
jade self-assigned this 2026-03-10 18:14:09 +00:00
Member

This issue was mentioned on Gerrit on the following CLs:

  • commit message in cl/5362 ("Update nixpkgs and nix2container")
<!-- GERRIT_LINKBOT: {"cls": [{"backlink": "https://gerrit.lix.systems/c/lix/+/5362", "number": 5362, "kind": "commit message"}], "cl_meta": {"5362": {"change_title": "Update nixpkgs and nix2container"}}} --> This issue was mentioned on Gerrit on the following CLs: * commit message in [cl/5362](https://gerrit.lix.systems/c/lix/+/5362) ("Update nixpkgs and nix2container")
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
lix-project/lix#1152
No description provided.