* prune util/log and user logger Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org> * plaintext logger Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org> * add newline Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
		
			
				
	
	
		
			94 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Package docker builds docker images
 | |
| package docker
 | |
| 
 | |
| import (
 | |
| 	"archive/tar"
 | |
| 	"bytes"
 | |
| 	"io/ioutil"
 | |
| 	"os"
 | |
| 	"path/filepath"
 | |
| 
 | |
| 	docker "github.com/fsouza/go-dockerclient"
 | |
| 	log "github.com/micro/go-micro/v2/logger"
 | |
| 	"github.com/micro/go-micro/v2/runtime/local/build"
 | |
| )
 | |
| 
 | |
| type Builder struct {
 | |
| 	Options build.Options
 | |
| 	Client  *docker.Client
 | |
| }
 | |
| 
 | |
| func (d *Builder) Build(s *build.Source) (*build.Package, error) {
 | |
| 	image := filepath.Join(s.Repository.Path, s.Repository.Name)
 | |
| 
 | |
| 	buf := new(bytes.Buffer)
 | |
| 	tw := tar.NewWriter(buf)
 | |
| 	defer tw.Close()
 | |
| 
 | |
| 	dockerFile := "Dockerfile"
 | |
| 
 | |
| 	// open docker file
 | |
| 	f, err := os.Open(filepath.Join(s.Repository.Path, s.Repository.Name, dockerFile))
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 	// read docker file
 | |
| 	by, err := ioutil.ReadAll(f)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	tarHeader := &tar.Header{
 | |
| 		Name: dockerFile,
 | |
| 		Size: int64(len(by)),
 | |
| 	}
 | |
| 	err = tw.WriteHeader(tarHeader)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 	_, err = tw.Write(by)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 	tr := bytes.NewReader(buf.Bytes())
 | |
| 
 | |
| 	err = d.Client.BuildImage(docker.BuildImageOptions{
 | |
| 		Name:           image,
 | |
| 		Dockerfile:     dockerFile,
 | |
| 		InputStream:    tr,
 | |
| 		OutputStream:   ioutil.Discard,
 | |
| 		RmTmpContainer: true,
 | |
| 		SuppressOutput: true,
 | |
| 	})
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 	return &build.Package{
 | |
| 		Name:   image,
 | |
| 		Path:   image,
 | |
| 		Type:   "docker",
 | |
| 		Source: s,
 | |
| 	}, nil
 | |
| }
 | |
| 
 | |
| func (d *Builder) Clean(b *build.Package) error {
 | |
| 	image := filepath.Join(b.Path, b.Name)
 | |
| 	return d.Client.RemoveImage(image)
 | |
| }
 | |
| 
 | |
| func NewBuilder(opts ...build.Option) build.Builder {
 | |
| 	options := build.Options{}
 | |
| 	for _, o := range opts {
 | |
| 		o(&options)
 | |
| 	}
 | |
| 	endpoint := "unix:///var/run/docker.sock"
 | |
| 	client, err := docker.NewClient(endpoint)
 | |
| 	if err != nil {
 | |
| 		log.Fatal(err)
 | |
| 	}
 | |
| 	return &Builder{
 | |
| 		Options: options,
 | |
| 		Client:  client,
 | |
| 	}
 | |
| }
 |