dotcloud/docker

View on GitHub
daemon/containerd/imagespec.go

Summary

Maintainability
A
0 mins
Test Coverage
package containerd

import (
    "github.com/docker/docker/api/types/container"
    "github.com/docker/docker/dockerversion"
    "github.com/docker/docker/image"
    "github.com/docker/docker/layer"
    "github.com/docker/go-connections/nat"
    imagespec "github.com/moby/docker-image-spec/specs-go/v1"
    "github.com/opencontainers/go-digest"
    ocispec "github.com/opencontainers/image-spec/specs-go/v1"
)

// dockerOciImageToDockerImagePartial creates an image.Image from the imagespec.DockerOCIImage
// It doesn't set:
// - V1Image.ContainerConfig
// - V1Image.Container
// - Details
func dockerOciImageToDockerImagePartial(id image.ID, img imagespec.DockerOCIImage) *image.Image {
    v1Image := image.V1Image{
        DockerVersion: dockerversion.Version,
        Config:        dockerOCIImageConfigToContainerConfig(img.Config),
        Architecture:  img.Platform.Architecture,
        Variant:       img.Platform.Variant,
        OS:            img.Platform.OS,
        Author:        img.Author,
        Created:       img.Created,
    }

    rootFS := &image.RootFS{
        Type: img.RootFS.Type,
    }
    for _, diffId := range img.RootFS.DiffIDs {
        rootFS.DiffIDs = append(rootFS.DiffIDs, layer.DiffID(diffId))
    }

    out := image.NewImage(id)
    out.V1Image = v1Image
    out.RootFS = rootFS
    out.History = img.History
    out.OSFeatures = img.OSFeatures
    out.OSVersion = img.OSVersion
    return out
}

func dockerImageToDockerOCIImage(img image.Image) imagespec.DockerOCIImage {
    rootfs := ocispec.RootFS{
        Type:    img.RootFS.Type,
        DiffIDs: []digest.Digest{},
    }
    for _, diffId := range img.RootFS.DiffIDs {
        rootfs.DiffIDs = append(rootfs.DiffIDs, digest.Digest(diffId))
    }

    return imagespec.DockerOCIImage{
        Image: ocispec.Image{
            Created: img.Created,
            Author:  img.Author,
            Platform: ocispec.Platform{
                Architecture: img.Architecture,
                Variant:      img.Variant,
                OS:           img.OS,
                OSVersion:    img.OSVersion,
                OSFeatures:   img.OSFeatures,
            },
            RootFS:  rootfs,
            History: img.History,
        },
        Config: containerConfigToDockerOCIImageConfig(img.Config),
    }
}

func containerConfigToDockerOCIImageConfig(cfg *container.Config) imagespec.DockerOCIImageConfig {
    var ociCfg ocispec.ImageConfig
    var ext imagespec.DockerOCIImageConfigExt

    if cfg != nil {
        ociCfg = ocispec.ImageConfig{
            User:        cfg.User,
            Env:         cfg.Env,
            Entrypoint:  cfg.Entrypoint,
            Cmd:         cfg.Cmd,
            Volumes:     cfg.Volumes,
            WorkingDir:  cfg.WorkingDir,
            Labels:      cfg.Labels,
            StopSignal:  cfg.StopSignal,
            ArgsEscaped: cfg.ArgsEscaped, //nolint:staticcheck // Ignore SA1019. Need to keep it in image.
        }

        if len(cfg.ExposedPorts) > 0 {
            ociCfg.ExposedPorts = map[string]struct{}{}
            for k, v := range cfg.ExposedPorts {
                ociCfg.ExposedPorts[string(k)] = v
            }
        }
        ext.Healthcheck = cfg.Healthcheck
        ext.OnBuild = cfg.OnBuild
        ext.Shell = cfg.Shell
    }

    return imagespec.DockerOCIImageConfig{
        ImageConfig:             ociCfg,
        DockerOCIImageConfigExt: ext,
    }
}

func dockerOCIImageConfigToContainerConfig(cfg imagespec.DockerOCIImageConfig) *container.Config {
    exposedPorts := make(nat.PortSet, len(cfg.ExposedPorts))
    for k, v := range cfg.ExposedPorts {
        exposedPorts[nat.Port(k)] = v
    }

    return &container.Config{
        Entrypoint:   cfg.Entrypoint,
        Env:          cfg.Env,
        Cmd:          cfg.Cmd,
        User:         cfg.User,
        WorkingDir:   cfg.WorkingDir,
        ExposedPorts: exposedPorts,
        Volumes:      cfg.Volumes,
        Labels:       cfg.Labels,
        ArgsEscaped:  cfg.ArgsEscaped, //nolint:staticcheck // Ignore SA1019. Need to keep it in image.
        StopSignal:   cfg.StopSignal,
        Healthcheck:  cfg.Healthcheck,
        OnBuild:      cfg.OnBuild,
        Shell:        cfg.Shell,
    }
}