|
@@ -1,10 +1,118 @@
|
|
|
package buildme
|
|
|
|
|
|
-import "io"
|
|
|
+import (
|
|
|
+ "context"
|
|
|
+ "fmt"
|
|
|
+ "io"
|
|
|
+ "os"
|
|
|
+
|
|
|
+ "github.com/docker/docker/api/types"
|
|
|
+ "github.com/docker/docker/api/types/container"
|
|
|
+ docker "github.com/docker/docker/client"
|
|
|
+)
|
|
|
|
|
|
// Project type
|
|
|
type Project struct {
|
|
|
- io.ReadCloser // Tar format? tar reader perhaps
|
|
|
- Name string
|
|
|
- Dockerfile string
|
|
|
+ tarFile string
|
|
|
+ isTemp bool
|
|
|
+ //utils.Filer
|
|
|
+ //io.ReadCloser // Tar format? tar reader perhaps
|
|
|
+ Name string
|
|
|
+ Dockerfile string
|
|
|
+ Steps string
|
|
|
+}
|
|
|
+
|
|
|
+func NewProject(name string) *Project {
|
|
|
+ return &Project{
|
|
|
+ tarFile: "",
|
|
|
+ isTemp: false,
|
|
|
+ Name: name,
|
|
|
+ Dockerfile: "docker/Dockerfile.build",
|
|
|
+ Steps: "",
|
|
|
+ }
|
|
|
+}
|
|
|
+func (p *Project) SetTarFile(tarFile string, isTemp bool) *Project {
|
|
|
+ p.tarFile = tarFile
|
|
|
+ p.isTemp = isTemp
|
|
|
+ return p
|
|
|
+}
|
|
|
+func (p *Project) SetName(name string) *Project {
|
|
|
+ p.Name = name
|
|
|
+ return p
|
|
|
+}
|
|
|
+func (p *Project) SetDockerfile(dockerfile string) *Project {
|
|
|
+ p.Dockerfile = dockerfile
|
|
|
+ return p
|
|
|
+}
|
|
|
+
|
|
|
+func (p *Project) Reader() io.ReadCloser {
|
|
|
+ f, _ := os.Open(p.tarFile)
|
|
|
+ return f
|
|
|
+}
|
|
|
+
|
|
|
+func (p *Project) Close() {
|
|
|
+ if p.isTemp {
|
|
|
+ log.Println("Closing temporary file")
|
|
|
+ os.Remove(p.tarFile)
|
|
|
+ }
|
|
|
+ //os.Remove(tarFile) // Should remove??
|
|
|
+}
|
|
|
+
|
|
|
+func (p *Project) Docker() error {
|
|
|
+ log.Println("New docker environ")
|
|
|
+ cli, err := docker.NewEnvClient()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ dockertag := fmt.Sprintf("%s-builder", p.Name)
|
|
|
+ log.Println("Building and tagging:", dockertag)
|
|
|
+ ///////////////
|
|
|
+ /// DOCKER OPERATION / BUILDER operation
|
|
|
+ ctx := context.Background()
|
|
|
+ {
|
|
|
+ log.Println("Docker image build dockerfile:", p.Dockerfile)
|
|
|
+ imageRes, err := cli.ImageBuild(ctx, p.Reader(), types.ImageBuildOptions{Tags: []string{dockertag}, Dockerfile: p.Dockerfile})
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ defer imageRes.Body.Close()
|
|
|
+ io.Copy(os.Stdout, imageRes.Body) // Do some treatment somehow
|
|
|
+ //inf, err := cli.Info(ctx)
|
|
|
+ //log.Println("Info:", inf, err)
|
|
|
+ }
|
|
|
+
|
|
|
+ {
|
|
|
+
|
|
|
+ log.Println("Testing running the builder")
|
|
|
+ containerName := dockertag
|
|
|
+ containerCfg := &container.Config{AttachStdout: true, Cmd: []string{"cat", "/buildme/dist.tar.gz"}}
|
|
|
+ res, err := cli.ContainerCreate(ctx, containerCfg, nil, nil, containerName)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ log.Println("Created container ID:", res)
|
|
|
+ log.Println("Starting container test")
|
|
|
+ cr, _, err := cli.CopyFromContainer(ctx, res.ID, "/buildme/dist.tar.gz")
|
|
|
+ if err != nil {
|
|
|
+ log.Println("Copy error", err)
|
|
|
+ }
|
|
|
+ defer cr.Close()
|
|
|
+
|
|
|
+ f, err := os.OpenFile("DIST/test.tar.gz", os.O_CREATE|os.O_WRONLY, os.FileMode(0600))
|
|
|
+ io.Copy(f, cr)
|
|
|
+
|
|
|
+ /*err = cli.ContainerStart(ctx, res.ID, types.ContainerStartOptions{AttachStdout: true})
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }*/
|
|
|
+
|
|
|
+ log.Println("Please execute docker run", containerName, "> dist.tar.gz")
|
|
|
+ log.Println("Trying to remove container", res)
|
|
|
+ err = cli.ContainerRemove(ctx, res.ID, types.ContainerRemoveOptions{})
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return nil
|
|
|
}
|