diff --git a/_examples/actions/docker_action/Dockerfile b/_examples/actions/docker_action/Dockerfile index 7af7f8e..88ad6a0 100644 --- a/_examples/actions/docker_action/Dockerfile +++ b/_examples/actions/docker_action/Dockerfile @@ -3,6 +3,4 @@ FROM debian:bullseye-slim # Kraken relies on this path being the specified path WORKDIR /src/work/ -COPY . . - -RUN echo "# README docker" >> README.md +RUN echo "# README docker" > README.md diff --git a/_examples/actions/docker_action/kraken.yml b/_examples/actions/docker_action/kraken.yml index 0aa7013..f2c8dba 100644 --- a/_examples/actions/docker_action/kraken.yml +++ b/_examples/actions/docker_action/kraken.yml @@ -8,4 +8,4 @@ select: # organisation: "cibus" actions: - type: docker-build - entry: "Dockerfile" + entry: Dockerfile diff --git a/internal/actions/action.go b/internal/actions/action.go index ea4f253..bc9fdb4 100644 --- a/internal/actions/action.go +++ b/internal/actions/action.go @@ -31,6 +31,7 @@ func (a *Action) Execute(ctx context.Context, area *storage.Area) error { zap.L().Debug("Execution done") case "docker-build": + zap.L().Debug("Building docker-build") runCmd, err := builders.NewDockerBuild(zap.L()).Build(ctx, a.SchemaPath, action.Entry) if err != nil { return err diff --git a/internal/actions/builders/docker.go b/internal/actions/builders/docker.go index 644cdde..4120229 100644 --- a/internal/actions/builders/docker.go +++ b/internal/actions/builders/docker.go @@ -2,20 +2,23 @@ package builders import ( "context" + "crypto/rand" + "encoding/hex" "errors" "fmt" "os" "os/exec" "go.uber.org/zap" + "go.uber.org/zap/zapio" ) type DockerBuild struct { logger *zap.Logger } -func NewDockerBuild(logger *zap.Logger) *Go { - return &Go{logger: logger} +func NewDockerBuild(logger *zap.Logger) *DockerBuild { + return &DockerBuild{logger: logger} } type DockerRunCommand func(ctx context.Context, victimPath string) error @@ -27,7 +30,41 @@ func (g *DockerBuild) Build(ctx context.Context, modulePath, entryPath string) ( return nil, errors.New("could not find entry") } - g.logger.Debug("Go binary built!") + b := make([]byte, 20) + _, err := rand.Reader.Read(b) + if err != nil { + return nil, err + } + tag := hex.EncodeToString(b) + buildDockerCmd := fmt.Sprintf("(cd %s; docker build -f %s --tag kraken/%s .)", modulePath, entryPath, tag) + g.logger.Debug("Running command", zap.String("command", buildDockerCmd)) + + cmd := exec.CommandContext( + ctx, + "/bin/bash", + "-c", + buildDockerCmd, + ) + + debugwriter := &zapio.Writer{ + Log: g.logger, + Level: zap.DebugLevel, + } + defer debugwriter.Close() + + cmd.Stdout = debugwriter + cmd.Stderr = debugwriter + err = cmd.Start() + if err != nil { + return nil, err + } + + err = cmd.Wait() + if err != nil { + return nil, err + } + + g.logger.Debug("Docker image built!") return func(ctx context.Context, victimPath string) error { g.logger.Debug("Executing script", zap.String("victim", victimPath)) @@ -36,9 +73,23 @@ func (g *DockerBuild) Build(ctx context.Context, modulePath, entryPath string) ( ctx, "/bin/bash", "-c", - fmt.Sprintf("(cd %s; docker build)", modulePath), + fmt.Sprintf("docker run --rm -v %s/:/src/work/ kraken/%s", victimPath, tag), ) - return cmd.Run() + runDockerWriter := &zapio.Writer{ + Log: g.logger, + Level: zap.DebugLevel, + } + defer runDockerWriter.Close() + + cmd.Stdout = runDockerWriter + cmd.Stderr = runDockerWriter + + err = cmd.Start() + if err != nil { + return err + } + + return cmd.Wait() }, nil }