command-runner/internal/containers/finch/finch_build.go (55 lines of code) (raw):
package finch
import (
"context"
"path/filepath"
"strings"
"github.com/aws/codecatalyst-runner-cli/command-runner/internal/containers/types"
"github.com/aws/codecatalyst-runner-cli/command-runner/pkg/common"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
func (fcs *finchContainerService) BuildImage(input types.BuildImageInput) common.Executor {
return func(ctx context.Context) error {
logger := log.Ctx(ctx)
if input.Platform != "" {
logger.Info().Msgf("🐦 finch build -t %s --platform %s %s", input.ImageTag, input.Platform, input.ContextDir)
} else {
logger.Info().Msgf("🐦 finch build -t %s %s", input.ImageTag, input.ContextDir)
}
if common.Dryrun(ctx) {
return nil
}
if exists, err := fcs.ImageExistsLocally(ctx, input.ImageTag, input.Platform); exists {
log.Ctx(ctx).Debug().Msgf("skipping build - image '%s' already exists locally", input.ImageTag)
return nil
} else if err != nil {
return err
}
f, err := newFinch(finchInstallDir)
if err != nil {
return err
}
logger.Debug().Msgf("Building image from '%v'", input.ContextDir)
args := []string{"build", "--tag", input.ImageTag, "--file", filepath.Join(input.ContextDir, input.Dockerfile), "--rm"}
if input.Platform != "" {
args = append(args, "--platform", input.Platform)
}
args = append(args, input.ContextDir)
logger.Debug().Msgf("Creating image from context dir '%s' with tag '%s' and platform '%s'", input.ContextDir, input.ImageTag, input.Platform)
ldebug := &logWriter{
logger: logger,
level: zerolog.DebugLevel,
}
return f.RunWithStdio(ctx, nil, ldebug, ldebug, args...)
}
}
type logWriter struct {
logger *zerolog.Logger
level zerolog.Level
}
func (l *logWriter) Write(p []byte) (int, error) {
if len(p) > 0 {
l.logger.WithLevel(l.level).Msg(strings.TrimSpace(string(p)))
}
return len(p), nil
}