mirror of
https://github.com/grafana/grafana.git
synced 2025-07-30 00:52:16 +08:00
70 lines
2.3 KiB
Go
70 lines
2.3 KiB
Go
package docker
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"dagger.io/dagger"
|
|
"github.com/grafana/grafana/pkg/build/daggerbuild/containers"
|
|
)
|
|
|
|
type BuildOpts struct {
|
|
// Dockerfile is the path to the dockerfile with the '-f' command.
|
|
// If it's not provided, then the docker command will default to 'Dockerfile' in `pwd`.
|
|
Dockerfile string
|
|
|
|
// Tags are provided as the '-t' argument, and can include the registry domain as well as the repository.
|
|
// Docker build supports building the same image with multiple tags.
|
|
// You might want to also include a 'latest' version of the tag.
|
|
Tags []string
|
|
// BuildArgs are provided to the docker command as '--build-arg'
|
|
BuildArgs []string
|
|
// Set the target build stage to build as '--target'
|
|
Target string
|
|
|
|
// Platform, if set to the non-default value, will use buildkit's emulation to build the docker image. This can be useful if building a docker image for a platform that doesn't match the host platform.
|
|
Platform dagger.Platform
|
|
}
|
|
|
|
func Builder(d *dagger.Client, socket *dagger.Socket, targz *dagger.File) *dagger.Container {
|
|
extracted := containers.ExtractedArchive(d, targz)
|
|
|
|
// Instead of supplying the Platform argument here, we need to tell the host docker socket that it needs to build with the given platform.
|
|
return d.Container().From("docker").
|
|
WithUnixSocket("/var/run/docker.sock", socket).
|
|
WithWorkdir("/src").
|
|
WithMountedFile("/src/Dockerfile", extracted.File("Dockerfile")).
|
|
WithMountedFile("/src/packaging/docker/run.sh", extracted.File("packaging/docker/run.sh")).
|
|
WithMountedFile("/src/grafana.tar.gz", targz)
|
|
}
|
|
|
|
func Build(d *dagger.Client, builder *dagger.Container, opts *BuildOpts) *dagger.Container {
|
|
args := []string{"docker", "buildx", "build"}
|
|
if p := opts.Platform; p != "" {
|
|
args = append(args, fmt.Sprintf("--platform=%s", string(p)))
|
|
}
|
|
dockerfile := opts.Dockerfile
|
|
if dockerfile == "" {
|
|
dockerfile = "Dockerfile"
|
|
}
|
|
|
|
args = append(args, ".", "-f", dockerfile)
|
|
|
|
for _, v := range opts.BuildArgs {
|
|
args = append(args, fmt.Sprintf("--build-arg=%s", v))
|
|
}
|
|
|
|
for _, v := range opts.Tags {
|
|
args = append(args, "-t", v)
|
|
}
|
|
|
|
if opts.Target != "" {
|
|
args = append(args, "--target", opts.Target)
|
|
}
|
|
|
|
return builder.WithExec(args)
|
|
}
|
|
|
|
func Save(builder *dagger.Container, opts *BuildOpts) *dagger.File {
|
|
return builder.WithExec([]string{"docker", "save", opts.Tags[0], "-o", "image.tar.gz"}).File("image.tar.gz")
|
|
}
|