| package image // import "github.com/docker/docker/image" |
| |
| import ( |
| "runtime" |
| |
| "github.com/docker/docker/layer" |
| "github.com/sirupsen/logrus" |
| ) |
| |
| // TypeLayers is used for RootFS.Type for filesystems organized into layers. |
| const TypeLayers = "layers" |
| |
| // typeLayersWithBase is an older format used by Windows up to v1.12. We |
| // explicitly handle this as an error case to ensure that a daemon which still |
| // has an older image like this on disk can still start, even though the |
| // image itself is not usable. See https://github.com/docker/docker/pull/25806. |
| const typeLayersWithBase = "layers+base" |
| |
| // RootFS describes images root filesystem |
| // This is currently a placeholder that only supports layers. In the future |
| // this can be made into an interface that supports different implementations. |
| type RootFS struct { |
| Type string `json:"type"` |
| DiffIDs []layer.DiffID `json:"diff_ids,omitempty"` |
| } |
| |
| // NewRootFS returns empty RootFS struct |
| func NewRootFS() *RootFS { |
| return &RootFS{Type: TypeLayers} |
| } |
| |
| // Append appends a new diffID to rootfs |
| func (r *RootFS) Append(id layer.DiffID) { |
| r.DiffIDs = append(r.DiffIDs, id) |
| } |
| |
| // Clone returns a copy of the RootFS |
| func (r *RootFS) Clone() *RootFS { |
| newRoot := NewRootFS() |
| newRoot.Type = r.Type |
| newRoot.DiffIDs = make([]layer.DiffID, len(r.DiffIDs)) |
| copy(newRoot.DiffIDs, r.DiffIDs) |
| return newRoot |
| } |
| |
| // ChainID returns the ChainID for the top layer in RootFS. |
| func (r *RootFS) ChainID() layer.ChainID { |
| if runtime.GOOS == "windows" && r.Type == typeLayersWithBase { |
| logrus.Warnf("Layer type is unsupported on this platform. DiffIDs: '%v'", r.DiffIDs) |
| return "" |
| } |
| return layer.CreateChainID(r.DiffIDs) |
| } |