* logs alloc Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org> * fix allocs Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org> * fix allocs Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org> * tunnel allocs Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org> * try to fix tunnel Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org> * cache cipher for send Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org> * more logger Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org> * more logger Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org> * more logger Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org> * more logger Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org> * more logger Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org> * more logger Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org> * more logger 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"
 | 
						|
	"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 {
 | 
						|
		logger.Fatal(err)
 | 
						|
	}
 | 
						|
	return &Builder{
 | 
						|
		Options: options,
 | 
						|
		Client:  client,
 | 
						|
	}
 | 
						|
}
 |