main.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package main
  2. import (
  3. "encoding/json"
  4. "os"
  5. "path/filepath"
  6. resource "github.com/concourse/registry-image-resource"
  7. "github.com/google/go-containerregistry/pkg/name"
  8. "github.com/google/go-containerregistry/pkg/v1/remote"
  9. "github.com/sirupsen/logrus"
  10. )
  11. type InRequest struct {
  12. Source resource.Source `json:"source"`
  13. Version resource.Version `json:"version"`
  14. }
  15. type InResponse struct {
  16. Version resource.Version `json:"version"`
  17. Metadata []MetadataField `json:"metadata"`
  18. }
  19. type ImageMetadata struct {
  20. Env []string `json:"env"`
  21. User string `json:"user"`
  22. }
  23. type MetadataField struct {
  24. Name string `json:"name"`
  25. Value string `json:"value"`
  26. }
  27. func main() {
  28. logrus.SetOutput(os.Stderr)
  29. logrus.SetFormatter(&logrus.TextFormatter{
  30. ForceColors: true,
  31. })
  32. var req InRequest
  33. err := json.NewDecoder(os.Stdin).Decode(&req)
  34. if err != nil {
  35. logrus.Errorf("invalid payload: %s", err)
  36. os.Exit(1)
  37. return
  38. }
  39. if len(os.Args) < 2 {
  40. logrus.Errorf("destination path not specified")
  41. os.Exit(1)
  42. return
  43. }
  44. dest := os.Args[1]
  45. ref := req.Source.Repository + "@" + req.Version.Digest
  46. n, err := name.ParseReference(ref, name.WeakValidation)
  47. if err != nil {
  48. logrus.Errorf("failed to resolve name: %s", err)
  49. os.Exit(1)
  50. return
  51. }
  52. logrus.Infof("fetching %s", ref)
  53. image, err := remote.Image(n)
  54. if err != nil {
  55. logrus.Errorf("failed to locate remote image: %s", err)
  56. os.Exit(1)
  57. return
  58. }
  59. logrus.Infof("unpacking image")
  60. err = unpackImage(filepath.Join(dest, "rootfs"), image)
  61. if err != nil {
  62. logrus.Errorf("failed to extract image: %s", err)
  63. os.Exit(1)
  64. return
  65. }
  66. logrus.Infof("writing metadata")
  67. cfg, err := image.ConfigFile()
  68. if err != nil {
  69. logrus.Errorf("failed to inspect image config: %s", err)
  70. os.Exit(1)
  71. return
  72. }
  73. meta, err := os.Create(filepath.Join(dest, "metadata.json"))
  74. if err != nil {
  75. logrus.Errorf("failed to create image metadata: %s", err)
  76. os.Exit(1)
  77. return
  78. }
  79. err = json.NewEncoder(meta).Encode(ImageMetadata{
  80. Env: cfg.ContainerConfig.Env,
  81. User: cfg.ContainerConfig.User,
  82. })
  83. if err != nil {
  84. logrus.Errorf("failed to write image metadata: %s", err)
  85. os.Exit(1)
  86. return
  87. }
  88. err = meta.Close()
  89. if err != nil {
  90. logrus.Errorf("failed to close image metadata file: %s", err)
  91. os.Exit(1)
  92. return
  93. }
  94. json.NewEncoder(os.Stdout).Encode(InResponse{
  95. Version: req.Version,
  96. Metadata: []MetadataField{},
  97. })
  98. }