imagespec.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package containerd
  2. import (
  3. "github.com/docker/docker/api/types/container"
  4. "github.com/docker/docker/dockerversion"
  5. "github.com/docker/docker/image"
  6. imagespec "github.com/docker/docker/image/spec/specs-go/v1"
  7. "github.com/docker/docker/layer"
  8. "github.com/docker/go-connections/nat"
  9. "github.com/opencontainers/go-digest"
  10. ocispec "github.com/opencontainers/image-spec/specs-go/v1"
  11. )
  12. // dockerOciImageToDockerImagePartial creates an image.Image from the imagespec.DockerOCIImage
  13. // It doesn't set:
  14. // - V1Image.ContainerConfig
  15. // - V1Image.Container
  16. // - Details
  17. func dockerOciImageToDockerImagePartial(id image.ID, img imagespec.DockerOCIImage) *image.Image {
  18. v1Image := image.V1Image{
  19. DockerVersion: dockerversion.Version,
  20. Config: dockerOCIImageConfigToContainerConfig(img.Config),
  21. Architecture: img.Platform.Architecture,
  22. Variant: img.Platform.Variant,
  23. OS: img.Platform.OS,
  24. Author: img.Author,
  25. Created: img.Created,
  26. }
  27. rootFS := &image.RootFS{
  28. Type: img.RootFS.Type,
  29. }
  30. for _, diffId := range img.RootFS.DiffIDs {
  31. rootFS.DiffIDs = append(rootFS.DiffIDs, layer.DiffID(diffId))
  32. }
  33. out := image.NewImage(id)
  34. out.V1Image = v1Image
  35. out.RootFS = rootFS
  36. out.History = img.History
  37. out.OSFeatures = img.OSFeatures
  38. out.OSVersion = img.OSVersion
  39. return out
  40. }
  41. func dockerImageToDockerOCIImage(img image.Image) imagespec.DockerOCIImage {
  42. rootfs := ocispec.RootFS{
  43. Type: img.RootFS.Type,
  44. DiffIDs: []digest.Digest{},
  45. }
  46. for _, diffId := range img.RootFS.DiffIDs {
  47. rootfs.DiffIDs = append(rootfs.DiffIDs, digest.Digest(diffId))
  48. }
  49. return imagespec.DockerOCIImage{
  50. Image: ocispec.Image{
  51. Created: img.Created,
  52. Author: img.Author,
  53. Platform: ocispec.Platform{
  54. Architecture: img.Architecture,
  55. Variant: img.Variant,
  56. OS: img.OS,
  57. OSVersion: img.OSVersion,
  58. OSFeatures: img.OSFeatures,
  59. },
  60. RootFS: rootfs,
  61. History: img.History,
  62. },
  63. Config: containerConfigToDockerOCIImageConfig(img.Config),
  64. }
  65. }
  66. func containerConfigToDockerOCIImageConfig(cfg *container.Config) imagespec.DockerOCIImageConfig {
  67. var ociCfg ocispec.ImageConfig
  68. var ext imagespec.DockerOCIImageConfigExt
  69. if cfg != nil {
  70. ociCfg = ocispec.ImageConfig{
  71. User: cfg.User,
  72. Env: cfg.Env,
  73. Entrypoint: cfg.Entrypoint,
  74. Cmd: cfg.Cmd,
  75. Volumes: cfg.Volumes,
  76. WorkingDir: cfg.WorkingDir,
  77. Labels: cfg.Labels,
  78. StopSignal: cfg.StopSignal,
  79. ArgsEscaped: cfg.ArgsEscaped, //nolint:staticcheck // Ignore SA1019. Need to keep it in image.
  80. }
  81. if len(cfg.ExposedPorts) > 0 {
  82. ociCfg.ExposedPorts = map[string]struct{}{}
  83. for k, v := range cfg.ExposedPorts {
  84. ociCfg.ExposedPorts[string(k)] = v
  85. }
  86. }
  87. ext.Healthcheck = cfg.Healthcheck
  88. ext.OnBuild = cfg.OnBuild
  89. ext.Shell = cfg.Shell
  90. }
  91. return imagespec.DockerOCIImageConfig{
  92. ImageConfig: ociCfg,
  93. DockerOCIImageConfigExt: ext,
  94. }
  95. }
  96. func dockerOCIImageConfigToContainerConfig(cfg imagespec.DockerOCIImageConfig) *container.Config {
  97. exposedPorts := make(nat.PortSet, len(cfg.ExposedPorts))
  98. for k, v := range cfg.ExposedPorts {
  99. exposedPorts[nat.Port(k)] = v
  100. }
  101. return &container.Config{
  102. Entrypoint: cfg.Entrypoint,
  103. Env: cfg.Env,
  104. Cmd: cfg.Cmd,
  105. User: cfg.User,
  106. WorkingDir: cfg.WorkingDir,
  107. ExposedPorts: exposedPorts,
  108. Volumes: cfg.Volumes,
  109. Labels: cfg.Labels,
  110. ArgsEscaped: cfg.ArgsEscaped, //nolint:staticcheck // Ignore SA1019. Need to keep it in image.
  111. StopSignal: cfg.StopSignal,
  112. Healthcheck: cfg.Healthcheck,
  113. OnBuild: cfg.OnBuild,
  114. Shell: cfg.Shell,
  115. }
  116. }