mirror of
https://github.com/containers/podman
synced 2024-10-22 02:03:38 +00:00
26a6e0de46
podman commit allows the user to commit containers as images with options of tagging th image, setting a commit message, setting the auther, and making changes to the instructions. Signed-off-by: umohnani8 <umohnani@redhat.com> Closes: #143 Approved by: rhatdan
82 lines
2.2 KiB
Go
82 lines
2.2 KiB
Go
package libpod
|
|
|
|
import (
|
|
"encoding/json"
|
|
"strings"
|
|
|
|
"github.com/containers/image/types"
|
|
"github.com/containers/storage"
|
|
digest "github.com/opencontainers/go-digest"
|
|
ociv1 "github.com/opencontainers/image-spec/specs-go/v1"
|
|
"github.com/pkg/errors"
|
|
"github.com/projectatomic/libpod/libpod/driver"
|
|
)
|
|
|
|
func getImageData(img storage.Image, imgRef types.Image, size int64, driver *driver.Data) (*ImageData, error) {
|
|
imgSize, err := imgRef.Size()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "error reading size of image %q", img.ID)
|
|
}
|
|
manifest, manifestType, err := imgRef.Manifest()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "error reading manifest for image %q", img.ID)
|
|
}
|
|
imgDigest := digest.Digest("")
|
|
if len(manifest) > 0 {
|
|
imgDigest = digest.Canonical.FromBytes(manifest)
|
|
}
|
|
annotations := annotations(manifest, manifestType)
|
|
|
|
ociv1Img, err := imgRef.OCIConfig()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "error getting oci image info %q", img.ID)
|
|
}
|
|
info, err := imgRef.Inspect()
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "error getting image info %q", img.ID)
|
|
}
|
|
|
|
var repoDigests []string
|
|
for _, name := range img.Names {
|
|
repoDigests = append(repoDigests, strings.SplitN(name, ":", 2)[0]+"@"+imgDigest.String())
|
|
}
|
|
|
|
data := &ImageData{
|
|
ID: img.ID,
|
|
RepoTags: img.Names,
|
|
RepoDigests: repoDigests,
|
|
Comment: ociv1Img.History[0].Comment,
|
|
Created: ociv1Img.Created,
|
|
Author: ociv1Img.Author,
|
|
Architecture: ociv1Img.Architecture,
|
|
Os: ociv1Img.OS,
|
|
Config: &ociv1Img.Config,
|
|
Version: info.DockerVersion,
|
|
Size: size,
|
|
VirtualSize: size + imgSize,
|
|
Annotations: annotations,
|
|
Digest: imgDigest,
|
|
Labels: info.Labels,
|
|
RootFS: &RootFS{
|
|
Type: ociv1Img.RootFS.Type,
|
|
Layers: ociv1Img.RootFS.DiffIDs,
|
|
},
|
|
GraphDriver: driver,
|
|
}
|
|
return data, nil
|
|
}
|
|
|
|
func annotations(manifest []byte, manifestType string) map[string]string {
|
|
annotations := make(map[string]string)
|
|
switch manifestType {
|
|
case ociv1.MediaTypeImageManifest:
|
|
var m ociv1.Manifest
|
|
if err := json.Unmarshal(manifest, &m); err == nil {
|
|
for k, v := range m.Annotations {
|
|
annotations[k] = v
|
|
}
|
|
}
|
|
}
|
|
return annotations
|
|
}
|