gitee.com/liuxuezhan/go-micro-v1.18.0@v1.0.0/runtime/build/docker/docker.go (about) 1 // Package docker builds docker images 2 package docker 3 4 import ( 5 "archive/tar" 6 "bytes" 7 "io/ioutil" 8 "os" 9 "path/filepath" 10 11 docker "github.com/fsouza/go-dockerclient" 12 "gitee.com/liuxuezhan/go-micro-v1.18.0/runtime/build" 13 "gitee.com/liuxuezhan/go-micro-v1.18.0/util/log" 14 ) 15 16 type Builder struct { 17 Options build.Options 18 Client *docker.Client 19 } 20 21 func (d *Builder) Build(s *build.Source) (*build.Package, error) { 22 image := filepath.Join(s.Repository.Path, s.Repository.Name) 23 24 buf := new(bytes.Buffer) 25 tw := tar.NewWriter(buf) 26 defer tw.Close() 27 28 dockerFile := "Dockerfile" 29 30 // open docker file 31 f, err := os.Open(filepath.Join(s.Repository.Path, s.Repository.Name, dockerFile)) 32 if err != nil { 33 return nil, err 34 } 35 // read docker file 36 by, err := ioutil.ReadAll(f) 37 if err != nil { 38 return nil, err 39 } 40 41 tarHeader := &tar.Header{ 42 Name: dockerFile, 43 Size: int64(len(by)), 44 } 45 err = tw.WriteHeader(tarHeader) 46 if err != nil { 47 return nil, err 48 } 49 _, err = tw.Write(by) 50 if err != nil { 51 return nil, err 52 } 53 tr := bytes.NewReader(buf.Bytes()) 54 55 err = d.Client.BuildImage(docker.BuildImageOptions{ 56 Name: image, 57 Dockerfile: dockerFile, 58 InputStream: tr, 59 OutputStream: ioutil.Discard, 60 RmTmpContainer: true, 61 SuppressOutput: true, 62 }) 63 if err != nil { 64 return nil, err 65 } 66 return &build.Package{ 67 Name: image, 68 Path: image, 69 Type: "docker", 70 Source: s, 71 }, nil 72 } 73 74 func (d *Builder) Clean(b *build.Package) error { 75 image := filepath.Join(b.Path, b.Name) 76 return d.Client.RemoveImage(image) 77 } 78 79 func NewBuilder(opts ...build.Option) build.Builder { 80 options := build.Options{} 81 for _, o := range opts { 82 o(&options) 83 } 84 endpoint := "unix:///var/run/docker.sock" 85 client, err := docker.NewClient(endpoint) 86 if err != nil { 87 log.Fatal(err) 88 } 89 return &Builder{ 90 Options: options, 91 Client: client, 92 } 93 }