empty.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package layer // import "github.com/docker/docker/layer"
  2. import (
  3. "archive/tar"
  4. "bytes"
  5. "fmt"
  6. "io"
  7. )
  8. // DigestSHA256EmptyTar is the canonical sha256 digest of empty tar file -
  9. // (1024 NULL bytes)
  10. const DigestSHA256EmptyTar = DiffID("sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef")
  11. type emptyLayer struct{}
  12. // EmptyLayer is a layer that corresponds to empty tar.
  13. var EmptyLayer = &emptyLayer{}
  14. func (el *emptyLayer) TarStream() (io.ReadCloser, error) {
  15. buf := new(bytes.Buffer)
  16. tarWriter := tar.NewWriter(buf)
  17. tarWriter.Close()
  18. return io.NopCloser(buf), nil
  19. }
  20. func (el *emptyLayer) TarStreamFrom(p ChainID) (io.ReadCloser, error) {
  21. if p == "" {
  22. return el.TarStream()
  23. }
  24. return nil, fmt.Errorf("can't get parent tar stream of an empty layer")
  25. }
  26. func (el *emptyLayer) ChainID() ChainID {
  27. return ChainID(DigestSHA256EmptyTar)
  28. }
  29. func (el *emptyLayer) DiffID() DiffID {
  30. return DigestSHA256EmptyTar
  31. }
  32. func (el *emptyLayer) Parent() Layer {
  33. return nil
  34. }
  35. func (el *emptyLayer) Size() int64 {
  36. return 0
  37. }
  38. func (el *emptyLayer) DiffSize() int64 {
  39. return 0
  40. }
  41. func (el *emptyLayer) Metadata() (map[string]string, error) {
  42. return make(map[string]string), nil
  43. }
  44. // IsEmpty returns true if the layer is an EmptyLayer
  45. func IsEmpty(diffID DiffID) bool {
  46. return diffID == DigestSHA256EmptyTar
  47. }