Packager is now builder (#958)
This commit is contained in:
		
							
								
								
									
										93
									
								
								runtime/build/docker/docker.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								runtime/build/docker/docker.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,93 @@ | ||||
| // 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/runtime/build" | ||||
| 	"github.com/micro/go-micro/util/log" | ||||
| ) | ||||
|  | ||||
| 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, | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user