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  }