mirror of
https://github.com/containers/podman.git
synced 2025-09-27 16:54:42 +08:00
podman save: add --uncompressed
Add an option to `podman save` to allow uncompressed layers when copying OCI images. Do the neccessary plumbing for the remote client, add tests and vendor in the latest commit from c/common to fetch the neccessary changes in libimage. Closes: #11613 Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
This commit is contained in:
18
vendor/github.com/containers/common/libimage/copier.go
generated
vendored
18
vendor/github.com/containers/common/libimage/copier.go
generated
vendored
@ -12,6 +12,7 @@ import (
|
||||
"github.com/containers/common/pkg/retry"
|
||||
"github.com/containers/image/v5/copy"
|
||||
"github.com/containers/image/v5/docker/reference"
|
||||
"github.com/containers/image/v5/pkg/compression"
|
||||
"github.com/containers/image/v5/signature"
|
||||
storageTransport "github.com/containers/image/v5/storage"
|
||||
"github.com/containers/image/v5/types"
|
||||
@ -40,6 +41,10 @@ type CopyOptions struct {
|
||||
// Allows for customizing the destination reference lookup. This can
|
||||
// be used to use custom blob caches.
|
||||
DestinationLookupReferenceFunc LookupReferenceFunc
|
||||
// CompressionFormat is the format to use for the compression of the blobs
|
||||
CompressionFormat *compression.Algorithm
|
||||
// CompressionLevel specifies what compression level is used
|
||||
CompressionLevel *int
|
||||
|
||||
// containers-auth.json(5) file to use when authenticating against
|
||||
// container registries.
|
||||
@ -65,6 +70,8 @@ type CopyOptions struct {
|
||||
// types. Short forms (e.g., oci, v2s2) used by some tools are not
|
||||
// supported.
|
||||
ManifestMIMEType string
|
||||
// Accept uncompressed layers when copying OCI images.
|
||||
OciAcceptUncompressedLayers bool
|
||||
// If OciEncryptConfig is non-nil, it indicates that an image should be
|
||||
// encrypted. The encryption options is derived from the construction
|
||||
// of EncryptConfig object. Note: During initial encryption process of
|
||||
@ -242,6 +249,17 @@ func (r *Runtime) newCopier(options *CopyOptions) (*copier, error) {
|
||||
c.systemContext.DockerCertPath = options.CertDirPath
|
||||
}
|
||||
|
||||
if options.CompressionFormat != nil {
|
||||
c.systemContext.CompressionFormat = options.CompressionFormat
|
||||
}
|
||||
|
||||
if options.CompressionLevel != nil {
|
||||
c.systemContext.CompressionLevel = options.CompressionLevel
|
||||
}
|
||||
|
||||
// NOTE: for the sake of consistency it's called Oci* in the CopyOptions.
|
||||
c.systemContext.OCIAcceptUncompressedLayers = options.OciAcceptUncompressedLayers
|
||||
|
||||
policy, err := signature.DefaultPolicy(c.systemContext)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
1
vendor/github.com/containers/common/pkg/config/default.go
generated
vendored
1
vendor/github.com/containers/common/pkg/config/default.go
generated
vendored
@ -198,7 +198,6 @@ func DefaultConfig() (*Config, error) {
|
||||
TZ: "",
|
||||
Umask: "0022",
|
||||
UTSNS: "private",
|
||||
UserNS: "host",
|
||||
UserNSSize: DefaultUserNSSize,
|
||||
},
|
||||
Network: NetworkConfig{
|
||||
|
6
vendor/github.com/containers/common/pkg/secrets/secrets.go
generated
vendored
6
vendor/github.com/containers/common/pkg/secrets/secrets.go
generated
vendored
@ -24,8 +24,8 @@ const secretIDLength = 25
|
||||
// errInvalidPath indicates that the secrets path is invalid
|
||||
var errInvalidPath = errors.New("invalid secrets path")
|
||||
|
||||
// errNoSuchSecret indicates that the secret does not exist
|
||||
var errNoSuchSecret = errors.New("no such secret")
|
||||
// ErrNoSuchSecret indicates that the secret does not exist
|
||||
var ErrNoSuchSecret = errors.New("no such secret")
|
||||
|
||||
// errSecretNameInUse indicates that the secret name is already in use
|
||||
var errSecretNameInUse = errors.New("secret name in use")
|
||||
@ -152,7 +152,7 @@ func (s *SecretsManager) Store(name string, data []byte, driverType string, driv
|
||||
newID = newID[0:secretIDLength]
|
||||
_, err := s.lookupSecret(newID)
|
||||
if err != nil {
|
||||
if errors.Cause(err) == errNoSuchSecret {
|
||||
if errors.Cause(err) == ErrNoSuchSecret {
|
||||
secr.ID = newID
|
||||
break
|
||||
} else {
|
||||
|
12
vendor/github.com/containers/common/pkg/secrets/secretsdb.go
generated
vendored
12
vendor/github.com/containers/common/pkg/secrets/secretsdb.go
generated
vendored
@ -71,14 +71,14 @@ func (s *SecretsManager) getNameAndID(nameOrID string) (name, id string, err err
|
||||
name, id, err = s.getExactNameAndID(nameOrID)
|
||||
if err == nil {
|
||||
return name, id, nil
|
||||
} else if errors.Cause(err) != errNoSuchSecret {
|
||||
} else if errors.Cause(err) != ErrNoSuchSecret {
|
||||
return "", "", err
|
||||
}
|
||||
|
||||
// ID prefix may have been given, iterate through all IDs.
|
||||
// ID and partial ID has a max length of 25, so we return if its greater than that.
|
||||
if len(nameOrID) > secretIDLength {
|
||||
return "", "", errors.Wrapf(errNoSuchSecret, "no secret with name or id %q", nameOrID)
|
||||
return "", "", errors.Wrapf(ErrNoSuchSecret, "no secret with name or id %q", nameOrID)
|
||||
}
|
||||
exists := false
|
||||
var foundID, foundName string
|
||||
@ -96,7 +96,7 @@ func (s *SecretsManager) getNameAndID(nameOrID string) (name, id string, err err
|
||||
if exists {
|
||||
return foundName, foundID, nil
|
||||
}
|
||||
return "", "", errors.Wrapf(errNoSuchSecret, "no secret with name or id %q", nameOrID)
|
||||
return "", "", errors.Wrapf(ErrNoSuchSecret, "no secret with name or id %q", nameOrID)
|
||||
}
|
||||
|
||||
// getExactNameAndID takes a secret's name or ID and returns both its name and full ID.
|
||||
@ -115,7 +115,7 @@ func (s *SecretsManager) getExactNameAndID(nameOrID string) (name, id string, er
|
||||
return name, id, nil
|
||||
}
|
||||
|
||||
return "", "", errors.Wrapf(errNoSuchSecret, "no secret with name or id %q", nameOrID)
|
||||
return "", "", errors.Wrapf(ErrNoSuchSecret, "no secret with name or id %q", nameOrID)
|
||||
}
|
||||
|
||||
// exactSecretExists checks if the secret exists, given a name or ID
|
||||
@ -123,7 +123,7 @@ func (s *SecretsManager) getExactNameAndID(nameOrID string) (name, id string, er
|
||||
func (s *SecretsManager) exactSecretExists(nameOrID string) (bool, error) {
|
||||
_, _, err := s.getExactNameAndID(nameOrID)
|
||||
if err != nil {
|
||||
if errors.Cause(err) == errNoSuchSecret {
|
||||
if errors.Cause(err) == ErrNoSuchSecret {
|
||||
return false, nil
|
||||
}
|
||||
return false, err
|
||||
@ -158,7 +158,7 @@ func (s *SecretsManager) lookupSecret(nameOrID string) (*Secret, error) {
|
||||
return &secret, nil
|
||||
}
|
||||
|
||||
return nil, errors.Wrapf(errNoSuchSecret, "no secret with name or id %q", nameOrID)
|
||||
return nil, errors.Wrapf(ErrNoSuchSecret, "no secret with name or id %q", nameOrID)
|
||||
}
|
||||
|
||||
// Store creates a new secret in the secrets database.
|
||||
|
Reference in New Issue
Block a user