main.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. var req InRequest
  30. err := json.NewDecoder(os.Stdin).Decode(&req)
  31. if err != nil {
  32. logrus.Errorf("invalid payload: %s", err)
  33. os.Exit(1)
  34. return
  35. }
  36. dest := os.Args[1]
  37. ref := req.Source.Repository + ":" + req.Source.Tag
  38. n, err := name.ParseReference(ref, name.WeakValidation)
  39. if err != nil {
  40. logrus.Errorf("failed to resolve name: %s", err)
  41. os.Exit(1)
  42. return
  43. }
  44. image, err := remote.Image(n)
  45. if err != nil {
  46. logrus.Errorf("Failed to locate remote image: %s", err)
  47. os.Exit(1)
  48. return
  49. }
  50. err = unpackImage(filepath.Join(dest, "rootfs"), image)
  51. if err != nil {
  52. logrus.Errorf("Failed to extract image: %s", err)
  53. os.Exit(1)
  54. return
  55. }
  56. meta, err := os.Create(filepath.Join(dest, "metadata.json"))
  57. if err != nil {
  58. logrus.Errorf("Failed to create image metadata: %s", err)
  59. os.Exit(1)
  60. return
  61. }
  62. cfg, err := image.ConfigFile()
  63. if err != nil {
  64. logrus.Errorf("Failed to inspect image config: %s", err)
  65. os.Exit(1)
  66. return
  67. }
  68. err = json.NewEncoder(meta).Encode(ImageMetadata{
  69. Env: cfg.ContainerConfig.Env,
  70. User: cfg.ContainerConfig.User,
  71. })
  72. if err != nil {
  73. logrus.Errorf("Failed to write image metadata: %s", err)
  74. os.Exit(1)
  75. return
  76. }
  77. json.NewEncoder(os.Stdout).Encode(InResponse{
  78. Version: req.Version,
  79. Metadata: []MetadataField{},
  80. })
  81. }