@@ -2,11 +2,15 @@ package cmd
22
33import (
44 "archive/tar"
5+ "encoding/json"
56 "errors"
67 "fmt"
8+ "io/ioutil"
79 "os"
810
911 "github.com/andres-erbsen/clock"
12+ "github.com/google/go-cmp/cmp"
13+ "github.com/google/go-cmp/cmp/cmpopts"
1014 "github.com/spf13/cobra"
1115 "github.com/uber/makisu/lib/docker/image"
1216 "github.com/uber/makisu/lib/log"
@@ -49,7 +53,6 @@ func getDiffCmd() *diffCmd {
4953}
5054
5155func (cmd * diffCmd ) Diff (imagesFullName []string ) error {
52- log .Infof ("ingore time? :%t" , cmd .ignoreModTime )
5356 var pullImages []image.Name
5457 for _ , imageFullName := range imagesFullName {
5558 pullImage , err := image .ParseNameForPull (imageFullName )
@@ -69,6 +72,7 @@ func (cmd *diffCmd) Diff(imagesFullName []string) error {
6972 }
7073
7174 var memFSArr []* snapshot.MemFS
75+ var imageConfigs []* image.Config
7276 for i , pullImage := range pullImages {
7377 client := registry .New (store , pullImage .GetRegistry (), pullImage .GetRepository ())
7478 manifest , err := client .Pull (pullImage .GetTag ())
@@ -94,11 +98,31 @@ func (cmd *diffCmd) Diff(imagesFullName []string) error {
9498 panic (fmt .Errorf ("untar image %d layer reader: %s" , i + 1 , err ))
9599 }
96100 }
101+
97102 memFSArr = append (memFSArr , memfs )
103+ reader , err := store .Layers .GetStoreFileReader (manifest .GetConfigDigest ().Hex ())
104+ if err != nil {
105+ panic (fmt .Errorf ("get image%d config file reader %s: %s" , i + 1 , manifest .GetConfigDigest ().Hex (), err ))
106+ }
107+
108+ configBytes , err := ioutil .ReadAll (reader )
109+ if err != nil {
110+ panic (fmt .Errorf ("read image%d config file %s: %s" , i + 1 , manifest .GetConfigDigest ().Hex (), err ))
111+ }
112+
113+ config := new (image.Config )
114+ if err := json .Unmarshal (configBytes , config ); err != nil {
115+ panic (fmt .Errorf ("unmarshal image%d config file %s: %s" , i + 1 , manifest .GetConfigDigest ().Hex (), err ))
116+ }
117+ imageConfigs = append (imageConfigs , config )
118+ }
119+
120+ log .Infof ("* Diff image configs " )
121+ if configDiff := cmp .Diff (imageConfigs [0 ], imageConfigs [1 ], cmpopts .IgnoreUnexported (image.Config {})); configDiff != "" {
122+ log .Infof ("-image %s +image %s):\n %s" , pullImages [0 ].GetRepository ()+ ":" + pullImages [0 ].GetTag (), pullImages [1 ].GetRepository ()+ ":" + pullImages [1 ].GetTag (), configDiff )
98123 }
99124
100- log .Infof ("* Diff two images" )
101- // TODO: compare the image config.
125+ log .Infof ("* Diff image layers" )
102126 snapshot .CompareFS (memFSArr [0 ], memFSArr [1 ], pullImages [0 ], pullImages [1 ], cmd .ignoreModTime )
103127 return nil
104128}
0 commit comments