github.com/git-ogawa/go-dbyml@v1.2.1/dbyml/context.go (about) 1 package dbyml 2 3 import ( 4 "archive/tar" 5 "bytes" 6 "io/ioutil" 7 "log" 8 "os" 9 "path/filepath" 10 "regexp" 11 12 "github.com/moby/moby/pkg/fileutils" 13 ) 14 15 // GetBuildContext makes tar archive of files and directories in a given directory, and returns 16 // byte.Buffer of the archive. The buffer is used for build context to build an image. 17 func GetBuildContext(dir string) (buf *bytes.Buffer) { 18 buf = new(bytes.Buffer) 19 tw := tar.NewWriter(buf) 20 defer tw.Close() 21 22 excludes, err := ReadDockerignore(dir) 23 if err != nil { 24 panic(err) 25 } 26 27 if err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { 28 // Check exclude 29 if rm, _ := IsExclude(path, excludes); rm { 30 return nil 31 } 32 33 if info.IsDir() { 34 return nil 35 } 36 37 f, err := os.Open(path) 38 if err != nil { 39 return err 40 } 41 defer f.Close() 42 43 b, err := ioutil.ReadAll(f) 44 if err != nil { 45 return err 46 } 47 48 // Write header 49 if err := tw.WriteHeader(&tar.Header{ 50 Name: path, 51 Mode: int64(info.Mode()), 52 ModTime: info.ModTime(), 53 Size: info.Size(), 54 }); err != nil { 55 return err 56 } 57 58 // Write body 59 _, err = tw.Write(b) 60 if err != nil { 61 log.Fatal(err, " :unable to write tar body") 62 } 63 return nil 64 }); err != nil { 65 panic(err) 66 } 67 return buf 68 } 69 70 // IsExclude returns true if file matches any of the patterns and isn't excluded by any of the subsequent patterns. 71 func IsExclude(file string, exclude []string) (bool, error) { 72 return fileutils.Matches(file, exclude) 73 } 74 75 // GetBuildContext makes tar archive of files and directories in a given directory, and returns 76 // byte.Buffer of the archive. The buffer is used for build context to build an image in bubildkitd container. 77 func GetBuildkitContext(dir string) (buf *bytes.Buffer) { 78 buf = new(bytes.Buffer) 79 tw := tar.NewWriter(buf) 80 defer tw.Close() 81 82 excludes, err := ReadDockerignore(dir) 83 if err != nil { 84 panic(err) 85 } 86 87 if err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { 88 // Check exclude 89 if rm, _ := IsExclude(path, excludes); rm { 90 return nil 91 } 92 93 if info.IsDir() { 94 return nil 95 } 96 97 f, err := os.Open(path) 98 if err != nil { 99 return err 100 } 101 defer f.Close() 102 103 b, err := ioutil.ReadAll(f) 104 if err != nil { 105 return err 106 } 107 108 // Replace directory 109 str := regexp.MustCompile(dir) 110 path = str.ReplaceAllString(path, ".") 111 112 // Write header 113 if err := tw.WriteHeader(&tar.Header{ 114 Name: path, 115 Mode: int64(info.Mode()), 116 ModTime: info.ModTime(), 117 Size: info.Size(), 118 }); err != nil { 119 return err 120 } 121 122 // Write body 123 _, err = tw.Write(b) 124 if err != nil { 125 log.Fatal(err, " :unable to write tar body") 126 } 127 return nil 128 }); err != nil { 129 panic(err) 130 } 131 return buf 132 }