mirror of
https://github.com/containers/podman.git
synced 2025-10-19 12:12:36 +08:00
vendor: bump c/image and c/common
bump github.com/containers/common -> v0.55.1-0.20230801150045-44bfd82e3ed2 bump github.com/containers/image/v5 -> v5.26.1-0.20230726142307-8c387a14f4ac [NO NEW TESTS NEEDED] Signed-off-by: Aditya R <arajan@redhat.com>
This commit is contained in:
3
vendor/github.com/containers/common/libimage/manifest_list.go
generated
vendored
3
vendor/github.com/containers/common/libimage/manifest_list.go
generated
vendored
@ -415,6 +415,8 @@ type ManifestListPushOptions struct {
|
||||
ImageListSelection imageCopy.ImageListSelection
|
||||
// Use when selecting only specific imags.
|
||||
Instances []digest.Digest
|
||||
// Add existing instances with requested compression algorithms to manifest list
|
||||
AddCompression []string
|
||||
}
|
||||
|
||||
// Push pushes a manifest to the specified destination.
|
||||
@ -446,6 +448,7 @@ func (m *ManifestList) Push(ctx context.Context, destination string, options *Ma
|
||||
defer copier.close()
|
||||
|
||||
pushOptions := manifests.PushOptions{
|
||||
AddCompression: options.AddCompression,
|
||||
Store: m.image.runtime.store,
|
||||
SystemContext: copier.systemContext,
|
||||
ImageListSelection: options.ImageListSelection,
|
||||
|
19
vendor/github.com/containers/common/libimage/manifests/manifests.go
generated
vendored
19
vendor/github.com/containers/common/libimage/manifests/manifests.go
generated
vendored
@ -14,6 +14,7 @@ import (
|
||||
"github.com/containers/image/v5/docker/reference"
|
||||
"github.com/containers/image/v5/image"
|
||||
"github.com/containers/image/v5/manifest"
|
||||
"github.com/containers/image/v5/pkg/compression"
|
||||
"github.com/containers/image/v5/signature"
|
||||
"github.com/containers/image/v5/signature/signer"
|
||||
is "github.com/containers/image/v5/storage"
|
||||
@ -70,6 +71,7 @@ type PushOptions struct {
|
||||
RemoveSignatures bool // true to discard signatures in images
|
||||
ManifestType string // the format to use when saving the list - possible options are oci, v2s1, and v2s2
|
||||
SourceFilter LookupReferenceFunc // filter the list source
|
||||
AddCompression []string // add existing instances with requested compression algorithms to manifest list
|
||||
}
|
||||
|
||||
// Create creates a new list containing information about the specified image,
|
||||
@ -239,6 +241,10 @@ func (l *list) Push(ctx context.Context, dest types.ImageReference, options Push
|
||||
return nil, "", err
|
||||
}
|
||||
}
|
||||
compressionVariants, err := prepareAddWithCompression(options.AddCompression)
|
||||
if err != nil {
|
||||
return nil, "", err
|
||||
}
|
||||
copyOptions := &cp.Options{
|
||||
ImageListSelection: options.ImageListSelection,
|
||||
Instances: options.Instances,
|
||||
@ -252,6 +258,7 @@ func (l *list) Push(ctx context.Context, dest types.ImageReference, options Push
|
||||
SignBySigstorePrivateKeyFile: options.SignBySigstorePrivateKeyFile,
|
||||
SignSigstorePrivateKeyPassphrase: options.SignSigstorePrivateKeyPassphrase,
|
||||
ForceManifestMIMEType: singleImageManifestType,
|
||||
EnsureCompressionVariantsExist: compressionVariants,
|
||||
}
|
||||
|
||||
// Copy whatever we were asked to copy.
|
||||
@ -266,6 +273,18 @@ func (l *list) Push(ctx context.Context, dest types.ImageReference, options Push
|
||||
return nil, manifestDigest, nil
|
||||
}
|
||||
|
||||
func prepareAddWithCompression(variants []string) ([]cp.OptionCompressionVariant, error) {
|
||||
res := []cp.OptionCompressionVariant{}
|
||||
for _, name := range variants {
|
||||
algo, err := compression.AlgorithmByName(name)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("requested algorithm %s is not supported for replication: %w", name, err)
|
||||
}
|
||||
res = append(res, cp.OptionCompressionVariant{Algorithm: algo})
|
||||
}
|
||||
return res, nil
|
||||
}
|
||||
|
||||
// Add adds information about the specified image to the list, computing the
|
||||
// image's manifest's digest, retrieving OS and architecture information from
|
||||
// the image's configuration, and recording the image's reference so that it
|
||||
|
35
vendor/github.com/containers/common/pkg/config/config.go
generated
vendored
35
vendor/github.com/containers/common/pkg/config/config.go
generated
vendored
@ -1168,27 +1168,6 @@ func IsValidDeviceMode(mode string) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
// resolveHomeDir converts a path referencing the home directory via "~"
|
||||
// to an absolute path
|
||||
func resolveHomeDir(path string) (string, error) {
|
||||
// check if the path references the home dir to avoid work
|
||||
// don't use strings.HasPrefix(path, "~") as this doesn't match "~" alone
|
||||
// use strings.HasPrefix(...) to not match "something/~/something"
|
||||
if !(path == "~" || strings.HasPrefix(path, "~/")) {
|
||||
// path does not reference home dir -> Nothing to do
|
||||
return path, nil
|
||||
}
|
||||
|
||||
// only get HomeDir when necessary
|
||||
home, err := unshare.HomeDir()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// replace the first "~" (start of path) with the HomeDir to resolve "~"
|
||||
return strings.Replace(path, "~", home, 1), nil
|
||||
}
|
||||
|
||||
func rootlessConfigPath() (string, error) {
|
||||
if configHome := os.Getenv("XDG_CONFIG_HOME"); configHome != "" {
|
||||
return filepath.Join(configHome, _configPath), nil
|
||||
@ -1201,20 +1180,6 @@ func rootlessConfigPath() (string, error) {
|
||||
return filepath.Join(home, UserOverrideContainersConfig), nil
|
||||
}
|
||||
|
||||
func stringsEq(a, b []string) bool {
|
||||
if len(a) != len(b) {
|
||||
return false
|
||||
}
|
||||
|
||||
for i := range a {
|
||||
if a[i] != b[i] {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
var (
|
||||
configErr error
|
||||
configMutex sync.Mutex
|
||||
|
26
vendor/github.com/containers/common/pkg/config/config_local.go
generated
vendored
26
vendor/github.com/containers/common/pkg/config/config_local.go
generated
vendored
@ -9,37 +9,11 @@ import (
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"strings"
|
||||
"syscall"
|
||||
|
||||
"github.com/container-orchestrated-devices/container-device-interface/pkg/parser"
|
||||
units "github.com/docker/go-units"
|
||||
)
|
||||
|
||||
// isDirectory tests whether the given path exists and is a directory. It
|
||||
// follows symlinks.
|
||||
func isDirectory(path string) error {
|
||||
path, err := resolveHomeDir(path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
info, err := os.Stat(path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if !info.Mode().IsDir() {
|
||||
// Return a PathError to be consistent with os.Stat().
|
||||
return &os.PathError{
|
||||
Op: "stat",
|
||||
Path: path,
|
||||
Err: syscall.ENOTDIR,
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *EngineConfig) validatePaths() error {
|
||||
// Relative paths can cause nasty bugs, because core paths we use could
|
||||
// shift between runs or even parts of the program. - The OCI runtime
|
||||
|
1
vendor/github.com/containers/common/pkg/config/containers.conf
generated
vendored
1
vendor/github.com/containers/common/pkg/config/containers.conf
generated
vendored
@ -119,7 +119,6 @@ default_sysctls = [
|
||||
#
|
||||
#env = [
|
||||
# "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
|
||||
# "TERM=xterm",
|
||||
#]
|
||||
|
||||
# Pass all host environment variables into the container.
|
||||
|
1
vendor/github.com/containers/common/pkg/config/containers.conf-freebsd
generated
vendored
1
vendor/github.com/containers/common/pkg/config/containers.conf-freebsd
generated
vendored
@ -99,7 +99,6 @@ default_sysctls = [
|
||||
#
|
||||
#env = [
|
||||
# "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
|
||||
# "TERM=xterm",
|
||||
#]
|
||||
|
||||
# Pass all host environment variables into the container.
|
||||
|
1
vendor/github.com/containers/common/pkg/config/default.go
generated
vendored
1
vendor/github.com/containers/common/pkg/config/default.go
generated
vendored
@ -202,7 +202,6 @@ func DefaultConfig() (*Config, error) {
|
||||
EnableLabeling: selinuxEnabled(),
|
||||
Env: []string{
|
||||
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
|
||||
"TERM=xterm",
|
||||
},
|
||||
EnvHost: false,
|
||||
HTTPProxy: true,
|
||||
|
22
vendor/github.com/containers/image/v5/copy/copy.go
generated
vendored
22
vendor/github.com/containers/image/v5/copy/copy.go
generated
vendored
@ -17,6 +17,7 @@ import (
|
||||
"github.com/containers/image/v5/internal/private"
|
||||
"github.com/containers/image/v5/manifest"
|
||||
"github.com/containers/image/v5/pkg/blobinfocache"
|
||||
compression "github.com/containers/image/v5/pkg/compression/types"
|
||||
"github.com/containers/image/v5/signature"
|
||||
"github.com/containers/image/v5/signature/signer"
|
||||
"github.com/containers/image/v5/transports"
|
||||
@ -126,6 +127,21 @@ type Options struct {
|
||||
// Download layer contents with "nondistributable" media types ("foreign" layers) and translate the layer media type
|
||||
// to not indicate "nondistributable".
|
||||
DownloadForeignLayers bool
|
||||
|
||||
// Contains slice of OptionCompressionVariant, where copy will ensure that for each platform
|
||||
// in the manifest list, a variant with the requested compression will exist.
|
||||
// Invalid when copying a non-multi-architecture image. That will probably
|
||||
// change in the future.
|
||||
EnsureCompressionVariantsExist []OptionCompressionVariant
|
||||
}
|
||||
|
||||
// OptionCompressionVariant allows to supply information about
|
||||
// selected compression algorithm and compression level by the
|
||||
// end-user. Refer to EnsureCompressionVariantsExist to know
|
||||
// more about its usage.
|
||||
type OptionCompressionVariant struct {
|
||||
Algorithm compression.Algorithm
|
||||
Level *int // Only used when we are creating a new image instance using the specified algorithm, not when the image already contains such an instance
|
||||
}
|
||||
|
||||
// copier allows us to keep track of diffID values for blobs, and other
|
||||
@ -250,6 +266,9 @@ func Image(ctx context.Context, policyContext *signature.PolicyContext, destRef,
|
||||
}
|
||||
|
||||
if !multiImage {
|
||||
if len(options.EnsureCompressionVariantsExist) > 0 {
|
||||
return nil, fmt.Errorf("EnsureCompressionVariantsExist is not implemented when not creating a multi-architecture image")
|
||||
}
|
||||
// The simple case: just copy a single image.
|
||||
single, err := c.copySingleImage(ctx, c.unparsedToplevel, nil, copySingleImageOptions{requireCompressionFormatMatch: false})
|
||||
if err != nil {
|
||||
@ -257,6 +276,9 @@ func Image(ctx context.Context, policyContext *signature.PolicyContext, destRef,
|
||||
}
|
||||
copiedManifest = single.manifest
|
||||
} else if c.options.ImageListSelection == CopySystemImage {
|
||||
if len(options.EnsureCompressionVariantsExist) > 0 {
|
||||
return nil, fmt.Errorf("EnsureCompressionVariantsExist is not implemented when not creating a multi-architecture image")
|
||||
}
|
||||
// This is a manifest list, and we weren't asked to copy multiple images. Choose a single image that
|
||||
// matches the current system to copy, and copy it.
|
||||
mfest, manifestType, err := c.unparsedToplevel.Manifest(ctx)
|
||||
|
131
vendor/github.com/containers/image/v5/copy/multiple.go
generated
vendored
131
vendor/github.com/containers/image/v5/copy/multiple.go
generated
vendored
@ -5,15 +5,19 @@ import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"github.com/containers/image/v5/docker/reference"
|
||||
"github.com/containers/image/v5/internal/image"
|
||||
internalManifest "github.com/containers/image/v5/internal/manifest"
|
||||
"github.com/containers/image/v5/internal/set"
|
||||
"github.com/containers/image/v5/manifest"
|
||||
"github.com/containers/image/v5/pkg/compression"
|
||||
digest "github.com/opencontainers/go-digest"
|
||||
imgspecv1 "github.com/opencontainers/image-spec/specs-go/v1"
|
||||
"github.com/sirupsen/logrus"
|
||||
"golang.org/x/exp/maps"
|
||||
"golang.org/x/exp/slices"
|
||||
)
|
||||
|
||||
@ -27,23 +31,118 @@ const (
|
||||
type instanceCopy struct {
|
||||
op instanceCopyKind
|
||||
sourceDigest digest.Digest
|
||||
|
||||
// Fields which can be used by callers when operation
|
||||
// is `instanceCopyClone`
|
||||
cloneCompressionVariant OptionCompressionVariant
|
||||
clonePlatform *imgspecv1.Platform
|
||||
cloneAnnotations map[string]string
|
||||
}
|
||||
|
||||
// internal type only to make imgspecv1.Platform comparable
|
||||
type platformComparable struct {
|
||||
architecture string
|
||||
os string
|
||||
osVersion string
|
||||
osFeatures string
|
||||
variant string
|
||||
}
|
||||
|
||||
// Converts imgspecv1.Platform to a comparable format.
|
||||
func platformV1ToPlatformComparable(platform *imgspecv1.Platform) platformComparable {
|
||||
if platform == nil {
|
||||
return platformComparable{}
|
||||
}
|
||||
osFeatures := slices.Clone(platform.OSFeatures)
|
||||
sort.Strings(osFeatures)
|
||||
return platformComparable{architecture: platform.Architecture,
|
||||
os: platform.OS,
|
||||
// This is strictly speaking ambiguous, fields of OSFeatures can contain a ','. Probably good enough for now.
|
||||
osFeatures: strings.Join(osFeatures, ","),
|
||||
osVersion: platform.OSVersion,
|
||||
variant: platform.Variant,
|
||||
}
|
||||
}
|
||||
|
||||
// platformCompressionMap prepares a mapping of platformComparable -> CompressionAlgorithmNames for given digests
|
||||
func platformCompressionMap(list internalManifest.List, instanceDigests []digest.Digest) (map[platformComparable]*set.Set[string], error) {
|
||||
res := make(map[platformComparable]*set.Set[string])
|
||||
for _, instanceDigest := range instanceDigests {
|
||||
instanceDetails, err := list.Instance(instanceDigest)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("getting details for instance %s: %w", instanceDigest, err)
|
||||
}
|
||||
platform := platformV1ToPlatformComparable(instanceDetails.ReadOnly.Platform)
|
||||
platformSet, ok := res[platform]
|
||||
if !ok {
|
||||
platformSet = set.New[string]()
|
||||
res[platform] = platformSet
|
||||
}
|
||||
platformSet.AddSlice(instanceDetails.ReadOnly.CompressionAlgorithmNames)
|
||||
}
|
||||
return res, nil
|
||||
}
|
||||
|
||||
func validateCompressionVariantExists(input []OptionCompressionVariant) error {
|
||||
for _, option := range input {
|
||||
_, err := compression.AlgorithmByName(option.Algorithm.Name())
|
||||
if err != nil {
|
||||
return fmt.Errorf("invalid algorithm %q in option.EnsureCompressionVariantsExist: %w", option.Algorithm.Name(), err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// prepareInstanceCopies prepares a list of instances which needs to copied to the manifest list.
|
||||
func prepareInstanceCopies(instanceDigests []digest.Digest, options *Options) []instanceCopy {
|
||||
func prepareInstanceCopies(list internalManifest.List, instanceDigests []digest.Digest, options *Options) ([]instanceCopy, error) {
|
||||
res := []instanceCopy{}
|
||||
if options.ImageListSelection == CopySpecificImages && len(options.EnsureCompressionVariantsExist) > 0 {
|
||||
// List can already contain compressed instance for a compression selected in `EnsureCompressionVariantsExist`
|
||||
// It’s unclear what it means when `CopySpecificImages` includes an instance in options.Instances,
|
||||
// EnsureCompressionVariantsExist asks for an instance with some compression,
|
||||
// an instance with that compression already exists, but is not included in options.Instances.
|
||||
// We might define the semantics and implement this in the future.
|
||||
return res, fmt.Errorf("EnsureCompressionVariantsExist is not implemented for CopySpecificImages")
|
||||
}
|
||||
err := validateCompressionVariantExists(options.EnsureCompressionVariantsExist)
|
||||
if err != nil {
|
||||
return res, err
|
||||
}
|
||||
compressionsByPlatform, err := platformCompressionMap(list, instanceDigests)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for i, instanceDigest := range instanceDigests {
|
||||
if options.ImageListSelection == CopySpecificImages &&
|
||||
!slices.Contains(options.Instances, instanceDigest) {
|
||||
logrus.Debugf("Skipping instance %s (%d/%d)", instanceDigest, i+1, len(instanceDigests))
|
||||
continue
|
||||
}
|
||||
instanceDetails, err := list.Instance(instanceDigest)
|
||||
if err != nil {
|
||||
return res, fmt.Errorf("getting details for instance %s: %w", instanceDigest, err)
|
||||
}
|
||||
platform := platformV1ToPlatformComparable(instanceDetails.ReadOnly.Platform)
|
||||
compressionList := compressionsByPlatform[platform]
|
||||
for _, compressionVariant := range options.EnsureCompressionVariantsExist {
|
||||
if !compressionList.Contains(compressionVariant.Algorithm.Name()) {
|
||||
res = append(res, instanceCopy{
|
||||
op: instanceCopyClone,
|
||||
sourceDigest: instanceDigest,
|
||||
cloneCompressionVariant: compressionVariant,
|
||||
clonePlatform: instanceDetails.ReadOnly.Platform,
|
||||
cloneAnnotations: maps.Clone(instanceDetails.ReadOnly.Annotations),
|
||||
})
|
||||
// add current compression to the list so that we don’t create duplicate clones
|
||||
compressionList.Add(compressionVariant.Algorithm.Name())
|
||||
}
|
||||
}
|
||||
res = append(res, instanceCopy{
|
||||
op: instanceCopyCopy,
|
||||
sourceDigest: instanceDigest,
|
||||
})
|
||||
}
|
||||
return res
|
||||
return res, nil
|
||||
}
|
||||
|
||||
// copyMultipleImages copies some or all of an image list's instances, using
|
||||
@ -118,8 +217,11 @@ func (c *copier) copyMultipleImages(ctx context.Context) (copiedManifest []byte,
|
||||
// Copy each image, or just the ones we want to copy, in turn.
|
||||
instanceDigests := updatedList.Instances()
|
||||
instanceEdits := []internalManifest.ListEdit{}
|
||||
instanceCopyList := prepareInstanceCopies(instanceDigests, c.options)
|
||||
c.Printf("Copying %d of %d images in list\n", len(instanceCopyList), len(instanceDigests))
|
||||
instanceCopyList, err := prepareInstanceCopies(updatedList, instanceDigests, c.options)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("preparing instances for copy: %w", err)
|
||||
}
|
||||
c.Printf("Copying %d images generated from %d images in list\n", len(instanceCopyList), len(instanceDigests))
|
||||
for i, instance := range instanceCopyList {
|
||||
// Update instances to be edited by their `ListOperation` and
|
||||
// populate necessary fields.
|
||||
@ -140,6 +242,27 @@ func (c *copier) copyMultipleImages(ctx context.Context) (copiedManifest []byte,
|
||||
UpdateSize: int64(len(updated.manifest)),
|
||||
UpdateCompressionAlgorithms: updated.compressionAlgorithms,
|
||||
UpdateMediaType: updated.manifestMIMEType})
|
||||
case instanceCopyClone:
|
||||
logrus.Debugf("Replicating instance %s (%d/%d)", instance.sourceDigest, i+1, len(instanceCopyList))
|
||||
c.Printf("Replicating image %s (%d/%d)\n", instance.sourceDigest, i+1, len(instanceCopyList))
|
||||
unparsedInstance := image.UnparsedInstance(c.rawSource, &instanceCopyList[i].sourceDigest)
|
||||
updated, err := c.copySingleImage(ctx, unparsedInstance, &instanceCopyList[i].sourceDigest, copySingleImageOptions{
|
||||
requireCompressionFormatMatch: true,
|
||||
compressionFormat: &instance.cloneCompressionVariant.Algorithm,
|
||||
compressionLevel: instance.cloneCompressionVariant.Level})
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("replicating image %d/%d from manifest list: %w", i+1, len(instanceCopyList), err)
|
||||
}
|
||||
// Record the result of a possible conversion here.
|
||||
instanceEdits = append(instanceEdits, internalManifest.ListEdit{
|
||||
ListOperation: internalManifest.ListOpAdd,
|
||||
AddDigest: updated.manifestDigest,
|
||||
AddSize: int64(len(updated.manifest)),
|
||||
AddMediaType: updated.manifestMIMEType,
|
||||
AddPlatform: instance.clonePlatform,
|
||||
AddAnnotations: instance.cloneAnnotations,
|
||||
AddCompressionAlgorithms: updated.compressionAlgorithms,
|
||||
})
|
||||
default:
|
||||
return nil, fmt.Errorf("copying image: invalid copy operation %d", instance.op)
|
||||
}
|
||||
|
2
vendor/github.com/containers/image/v5/docker/policyconfiguration/naming.go
generated
vendored
2
vendor/github.com/containers/image/v5/docker/policyconfiguration/naming.go
generated
vendored
@ -40,7 +40,7 @@ func DockerReferenceNamespaces(ref reference.Named) []string {
|
||||
// then in its parent "docker.io/library"; in none of "busybox",
|
||||
// un-namespaced "library" nor in "" supposedly implicitly representing "library/".
|
||||
//
|
||||
// ref.FullName() == ref.Hostname() + "/" + ref.RemoteName(), so the last
|
||||
// ref.Name() == ref.Domain() + "/" + ref.Path(), so the last
|
||||
// iteration matches the host name (for any namespace).
|
||||
res := []string{}
|
||||
name := ref.Name()
|
||||
|
6
vendor/github.com/containers/image/v5/internal/set/set.go
generated
vendored
6
vendor/github.com/containers/image/v5/internal/set/set.go
generated
vendored
@ -28,6 +28,12 @@ func (s *Set[E]) Add(v E) {
|
||||
s.m[v] = struct{}{} // Possibly writing the same struct{}{} presence marker again.
|
||||
}
|
||||
|
||||
func (s *Set[E]) AddSlice(slice []E) {
|
||||
for _, v := range slice {
|
||||
s.Add(v)
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Set[E]) Delete(v E) {
|
||||
delete(s.m, v)
|
||||
}
|
||||
|
11
vendor/github.com/containers/image/v5/transports/alltransports/alltransports.go
generated
vendored
11
vendor/github.com/containers/image/v5/transports/alltransports/alltransports.go
generated
vendored
@ -4,8 +4,11 @@ import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
// register all known transports
|
||||
// NOTE: Make sure docs/containers-policy.json.5.md is updated when adding or updating
|
||||
"github.com/containers/image/v5/transports"
|
||||
"github.com/containers/image/v5/types"
|
||||
|
||||
// Register all known transports.
|
||||
// NOTE: Make sure docs/containers-transports.5.md and docs/containers-policy.json.5.md are updated when adding or updating
|
||||
// a transport.
|
||||
_ "github.com/containers/image/v5/directory"
|
||||
_ "github.com/containers/image/v5/docker"
|
||||
@ -15,11 +18,9 @@ import (
|
||||
_ "github.com/containers/image/v5/openshift"
|
||||
_ "github.com/containers/image/v5/sif"
|
||||
_ "github.com/containers/image/v5/tarball"
|
||||
|
||||
// The docker-daemon transport is registeredy by docker_daemon*.go
|
||||
// The ostree transport is registered by ostree*.go
|
||||
// The storage transport is registered by storage*.go
|
||||
"github.com/containers/image/v5/transports"
|
||||
"github.com/containers/image/v5/types"
|
||||
)
|
||||
|
||||
// ParseImageName converts a URL-like image name to a types.ImageReference.
|
||||
|
Reference in New Issue
Block a user