builder.go 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package docker
  2. import (
  3. "context"
  4. "fmt"
  5. "os"
  6. "github.com/docker/docker/api/types"
  7. "github.com/docker/docker/pkg/archive"
  8. "github.com/moby/moby/pkg/jsonmessage"
  9. "github.com/moby/term"
  10. )
  11. type BuildOpts struct {
  12. ImageRepo string
  13. Tag string
  14. BuildContext string
  15. Env map[string]string
  16. }
  17. // BuildLocal
  18. func (a *Agent) BuildLocal(opts *BuildOpts, dockerfilePath string) error {
  19. tar, err := archive.TarWithOptions(opts.BuildContext, &archive.TarOptions{})
  20. if err != nil {
  21. return err
  22. }
  23. buildArgs := make(map[string]*string)
  24. for key, val := range opts.Env {
  25. valCopy := val
  26. buildArgs[key] = &valCopy
  27. }
  28. out, err := a.client.ImageBuild(context.Background(), tar, types.ImageBuildOptions{
  29. Dockerfile: dockerfilePath,
  30. BuildArgs: buildArgs,
  31. Tags: []string{
  32. fmt.Sprintf("%s:%s", opts.ImageRepo, opts.Tag),
  33. },
  34. Remove: true,
  35. })
  36. if err != nil {
  37. return err
  38. }
  39. defer out.Body.Close()
  40. termFd, isTerm := term.GetFdInfo(os.Stderr)
  41. return jsonmessage.DisplayJSONMessagesStream(out.Body, os.Stderr, termFd, isTerm, nil)
  42. }