|
@@ -1,14 +1,12 @@
|
|
package buildme
|
|
package buildme
|
|
|
|
|
|
import (
|
|
import (
|
|
- "buildme/utils"
|
|
|
|
"context"
|
|
"context"
|
|
"io"
|
|
"io"
|
|
"os"
|
|
"os"
|
|
"path"
|
|
"path"
|
|
|
|
|
|
"dev.hexasoftware.com/hxs/prettylog"
|
|
"dev.hexasoftware.com/hxs/prettylog"
|
|
- "dev.hexasoftware.com/x/seq"
|
|
|
|
|
|
|
|
"github.com/docker/docker/api/types"
|
|
"github.com/docker/docker/api/types"
|
|
"github.com/docker/docker/api/types/container"
|
|
"github.com/docker/docker/api/types/container"
|
|
@@ -28,7 +26,7 @@ func ImageCli(imageName string) (*ImageCtx, error) {
|
|
if err != nil {
|
|
if err != nil {
|
|
return nil, err
|
|
return nil, err
|
|
}
|
|
}
|
|
- return &ImageCtx{imageName, "", cli}, nil
|
|
|
|
|
|
+ return &ImageCtx{imageName, imageName, cli}, nil
|
|
}
|
|
}
|
|
|
|
|
|
func (c *ImageCtx) Run(command []string) error {
|
|
func (c *ImageCtx) Run(command []string) error {
|
|
@@ -69,14 +67,14 @@ func (c *ImageCtx) Run(command []string) error {
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
|
|
|
|
-func (c *ImageCtx) Copy(src string, dst string) error {
|
|
|
|
|
|
+func (c *ImageCtx) Get(src string, dst string) error {
|
|
log := prettylog.New("COPY in IMAGE:")
|
|
log := prettylog.New("COPY in IMAGE:")
|
|
- log.Println("COPY", src, dst)
|
|
|
|
|
|
+ log.Println("GET", src, dst)
|
|
ctx := context.Background()
|
|
ctx := context.Background()
|
|
|
|
|
|
- conConfig := &container.Config{Image: c.tmpImgID}
|
|
|
|
|
|
+ conConfig := &container.Config{Image: c.tmpImgID, Cmd: []string{""}}
|
|
// Create container
|
|
// Create container
|
|
- log.Println("ContainerCreate")
|
|
|
|
|
|
+ log.Println("ContainerCreate from: ", c.tmpImgID)
|
|
ncon, err := c.cli.ContainerCreate(ctx, conConfig, nil, nil, "")
|
|
ncon, err := c.cli.ContainerCreate(ctx, conConfig, nil, nil, "")
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
@@ -103,243 +101,8 @@ func (c *ImageCtx) Copy(src string, dst string) error {
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
-
|
|
|
|
io.Copy(f, rd)
|
|
io.Copy(f, rd)
|
|
- f.Sync()
|
|
|
|
f.Close()
|
|
f.Close()
|
|
|
|
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
-
|
|
|
|
-func RunContainerX(imageName string, containerName string, command []string) error {
|
|
|
|
- log := prettylog.New("RUN CONTAINER")
|
|
|
|
-
|
|
|
|
- cli, err := docker.NewEnvClient()
|
|
|
|
- if err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
- ctx := context.Background()
|
|
|
|
-
|
|
|
|
- log.Println("inspecting container:", containerName)
|
|
|
|
- res, err := cli.ContainerInspect(ctx, containerName)
|
|
|
|
- if err != nil {
|
|
|
|
- containerCfg := &container.Config{
|
|
|
|
- Image: imageName,
|
|
|
|
- Cmd: []string{"ls"},
|
|
|
|
- }
|
|
|
|
- log.Println("===> Creating container")
|
|
|
|
- _, err := cli.ContainerCreate(ctx, containerCfg, nil, nil, containerName)
|
|
|
|
- if err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
- // Inspec again
|
|
|
|
- res, err = cli.ContainerInspect(ctx, containerName)
|
|
|
|
- //return err
|
|
|
|
- }
|
|
|
|
- log.Println("Check if container running")
|
|
|
|
- if !res.State.Running {
|
|
|
|
-
|
|
|
|
- var imgRes types.IDResponse
|
|
|
|
- var ncon container.ContainerCreateCreatedBody
|
|
|
|
-
|
|
|
|
- s := seq.NewSeq()
|
|
|
|
- s.Add("Commit", func() error {
|
|
|
|
- var err error
|
|
|
|
- imgRes, err = cli.ContainerCommit(ctx, containerName, types.ContainerCommitOptions{Config: res.Config})
|
|
|
|
- return err
|
|
|
|
- })
|
|
|
|
-
|
|
|
|
- s.Add("Tag", func() error { return cli.ImageTag(ctx, imgRes.ID, imageName+"build-1") })
|
|
|
|
-
|
|
|
|
- s.Add("Remove", cli.ContainerRemove, ctx, containerName, types.ContainerRemoveOptions{})
|
|
|
|
-
|
|
|
|
- s.Add("Create", func() (container.ContainerCreateCreatedBody, error) {
|
|
|
|
- return cli.ContainerCreate(ctx, &container.Config{Image: imgRes.ID, Cmd: command}, res.HostConfig, nil, res.Name)
|
|
|
|
- }).Grab(&ncon)
|
|
|
|
-
|
|
|
|
- s.Add("Start", func() error {
|
|
|
|
- return cli.ContainerStart(ctx, ncon.ID, types.ContainerStartOptions{})
|
|
|
|
- })
|
|
|
|
- s.Add("Wait", func() (int64, error) {
|
|
|
|
- return cli.ContainerWait(ctx, ncon.ID)
|
|
|
|
- })
|
|
|
|
- var rd io.ReadCloser
|
|
|
|
- s.Add("Copy", func() (io.ReadCloser, types.ContainerPathStat, error) {
|
|
|
|
- return cli.CopyFromContainer(ctx, ncon.ID, "/buildme/dist.tar.gz")
|
|
|
|
- }).Grab(&rd)
|
|
|
|
-
|
|
|
|
- s.Add("Save", func() error {
|
|
|
|
- f, err := os.OpenFile("./data/dist.tar.gz", os.O_CREATE|os.O_WRONLY, os.FileMode(0644))
|
|
|
|
- io.Copy(f, rd)
|
|
|
|
- return err
|
|
|
|
- })
|
|
|
|
-
|
|
|
|
- err := s.Exec()
|
|
|
|
- if err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- } else {
|
|
|
|
- log.Println("ContainerExecCreate")
|
|
|
|
- r, err := cli.ContainerExecCreate(ctx, containerName, types.ExecConfig{Cmd: command})
|
|
|
|
- if err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- log.Println("Executing command in Exec")
|
|
|
|
- err = cli.ContainerExecStart(ctx, r.ID, types.ExecStartCheck{})
|
|
|
|
- if err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
- log.Println("Is this a new container??:", r.ID)
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return nil
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-// Docker helper
|
|
|
|
-// RunContainer Run command in container
|
|
|
|
-// First check if container is running, then exec
|
|
|
|
-//
|
|
|
|
-func RunContainer(imageName string, containerName string, command string) error {
|
|
|
|
- log := prettylog.New("RUN CONTAINER")
|
|
|
|
-
|
|
|
|
- cli, err := docker.NewEnvClient()
|
|
|
|
- if err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
- ctx := context.Background()
|
|
|
|
-
|
|
|
|
- log.Println("inspecting container:", containerName)
|
|
|
|
- res, err := cli.ContainerInspect(ctx, containerName)
|
|
|
|
- if err != nil {
|
|
|
|
- containerCfg := &container.Config{
|
|
|
|
- Image: imageName,
|
|
|
|
- Cmd: []string{"ls"},
|
|
|
|
- }
|
|
|
|
- log.Println("===> Creating container")
|
|
|
|
- _, err := cli.ContainerCreate(ctx, containerCfg, nil, nil, containerName)
|
|
|
|
- if err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
- // Inspec again
|
|
|
|
- res, err = cli.ContainerInspect(ctx, containerName)
|
|
|
|
- //return err
|
|
|
|
- }
|
|
|
|
- log.Println("Check if container running")
|
|
|
|
- if !res.State.Running {
|
|
|
|
-
|
|
|
|
- //nImageName := containerName + "-tmp"
|
|
|
|
- log.Println("Container commit to")
|
|
|
|
- var err error
|
|
|
|
- var imgRes types.IDResponse
|
|
|
|
-
|
|
|
|
- if imgRes, err = cli.ContainerCommit(ctx, containerName, types.ContainerCommitOptions{Config: res.Config}); err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if err = cli.ImageTag(ctx, imgRes.ID, imageName+"build-1"); err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- log.Println("Removing container")
|
|
|
|
- if err = cli.ContainerRemove(ctx, containerName, types.ContainerRemoveOptions{}); err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- log.Println("Starting new container with", imgRes.ID)
|
|
|
|
- var ncon container.ContainerCreateCreatedBody
|
|
|
|
- if ncon, err = cli.ContainerCreate(ctx, &container.Config{Image: imgRes.ID, Cmd: utils.ParseField(command)}, res.HostConfig, nil, res.Name); err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if err = cli.ContainerStart(ctx, ncon.ID, types.ContainerStartOptions{}); err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- var ret int64
|
|
|
|
- if ret, err = cli.ContainerWait(ctx, ncon.ID); err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
- log.Println("Returning withcode:", ret)
|
|
|
|
-
|
|
|
|
- } else {
|
|
|
|
- log.Println("ContainerExecCreate")
|
|
|
|
- r, err := cli.ContainerExecCreate(ctx, containerName, types.ExecConfig{Cmd: utils.ParseField(command)})
|
|
|
|
- if err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- log.Println("Executing command in Exec")
|
|
|
|
- err = cli.ContainerExecStart(ctx, r.ID, types.ExecStartCheck{})
|
|
|
|
- if err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
- log.Println("Is this a new container??:", r.ID)
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return nil
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-//RunImageCmd run command in image and commit
|
|
|
|
-func RunImageCmd(image string, command string) error {
|
|
|
|
- log.Println("Executing in image", command, "image", image)
|
|
|
|
- cli, err := docker.NewEnvClient()
|
|
|
|
- if err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
- defer cli.Close()
|
|
|
|
- ctx := context.Background()
|
|
|
|
-
|
|
|
|
- containerCfg := &container.Config{
|
|
|
|
- AttachStdout: true,
|
|
|
|
- AttachStdin: true,
|
|
|
|
- AttachStderr: true,
|
|
|
|
-
|
|
|
|
- Image: image,
|
|
|
|
- Cmd: utils.ParseField(command),
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- log.Println("===> Creating container")
|
|
|
|
- containerRes, err := cli.ContainerCreate(ctx, containerCfg, nil, nil, image)
|
|
|
|
- if err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
- // Remove container
|
|
|
|
- defer func() {
|
|
|
|
- log.Println("===> Removing container", containerRes.ID)
|
|
|
|
- err := cli.ContainerRemove(ctx, containerRes.ID, types.ContainerRemoveOptions{})
|
|
|
|
- if err != nil {
|
|
|
|
- log.Println("Error removing container", err)
|
|
|
|
- }
|
|
|
|
- }()
|
|
|
|
-
|
|
|
|
- log.Println("===> Starting container")
|
|
|
|
- err = cli.ContainerStart(ctx, containerRes.ID, types.ContainerStartOptions{})
|
|
|
|
- if err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- log.Println("===> Waiting for container", containerRes.ID)
|
|
|
|
- retCode, err := cli.ContainerWait(ctx, containerRes.ID)
|
|
|
|
- if err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
- log.Println("Returned:", retCode)
|
|
|
|
-
|
|
|
|
- commitCfg := types.ContainerCommitOptions{
|
|
|
|
- Config: containerCfg,
|
|
|
|
- }
|
|
|
|
- log.Println("===> Commiting container")
|
|
|
|
- commitRes, err := cli.ContainerCommit(ctx, containerRes.ID, commitCfg)
|
|
|
|
- if err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- log.Println("===> Tagging container")
|
|
|
|
- err = cli.ImageTag(ctx, commitRes.ID, image)
|
|
|
|
- if err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
- return nil
|
|
|
|
-}
|
|
|