github.com/goreleaser/goreleaser@v1.25.1/internal/pipe/docker/api_docker.go (about) 1 package docker 2 3 import ( 4 "fmt" 5 "regexp" 6 7 "github.com/goreleaser/goreleaser/pkg/context" 8 ) 9 10 func init() { 11 registerManifester(useDocker, dockerManifester{}) 12 13 registerImager(useDocker, dockerImager{}) 14 registerImager(useBuildx, dockerImager{ 15 buildx: true, 16 }) 17 } 18 19 type dockerManifester struct{} 20 21 func (m dockerManifester) Create(ctx *context.Context, manifest string, images, flags []string) error { 22 _ = runCommand(ctx, ".", "docker", "manifest", "rm", manifest) 23 24 args := []string{"manifest", "create", manifest} 25 args = append(args, images...) 26 args = append(args, flags...) 27 28 if err := runCommand(ctx, ".", "docker", args...); err != nil { 29 return fmt.Errorf("failed to create %s: %w", manifest, err) 30 } 31 return nil 32 } 33 34 func (m dockerManifester) Push(ctx *context.Context, manifest string, flags []string) (string, error) { 35 args := []string{"manifest", "push", manifest} 36 args = append(args, flags...) 37 bts, err := runCommandWithOutput(ctx, ".", "docker", args...) 38 if err != nil { 39 return "", fmt.Errorf("failed to push %s: %w", manifest, err) 40 } 41 digest := dockerDigestPattern.FindString(string(bts)) 42 if digest == "" { 43 return "", fmt.Errorf("failed to find docker digest in docker push output: %s", string(bts)) 44 } 45 return digest, nil 46 } 47 48 type dockerImager struct { 49 buildx bool 50 } 51 52 var dockerDigestPattern = regexp.MustCompile("sha256:[a-z0-9]{64}") 53 54 func (i dockerImager) Push(ctx *context.Context, image string, _ []string) (string, error) { 55 bts, err := runCommandWithOutput(ctx, ".", "docker", "push", image) 56 if err != nil { 57 return "", fmt.Errorf("failed to push %s: %w", image, err) 58 } 59 digest := dockerDigestPattern.FindString(string(bts)) 60 if digest == "" { 61 return "", fmt.Errorf("failed to find docker digest in docker push output: %s", string(bts)) 62 } 63 return digest, nil 64 } 65 66 func (i dockerImager) Build(ctx *context.Context, root string, images, flags []string) error { 67 if err := runCommand(ctx, root, "docker", i.buildCommand(images, flags)...); err != nil { 68 return fmt.Errorf("failed to build %s: %w", images[0], err) 69 } 70 return nil 71 } 72 73 func (i dockerImager) buildCommand(images, flags []string) []string { 74 base := []string{"build", "."} 75 if i.buildx { 76 base = []string{"buildx", "build", ".", "--load"} 77 } 78 for _, image := range images { 79 base = append(base, "-t", image) 80 } 81 base = append(base, flags...) 82 return base 83 }