diff --git a/pkg/buildah/buildah.go b/pkg/buildah/buildah.go index 8432b70bce..e8069fd26e 100644 --- a/pkg/buildah/buildah.go +++ b/pkg/buildah/buildah.go @@ -25,11 +25,12 @@ type CommonOpts struct { type BuildFromDockerfileOpts struct { CommonOpts ContextTar io.Reader + BuildArgs map[string]string } type RunCommandOpts struct { CommonOpts - BuildArgs []string + Args []string } type FromCommandOpts struct { diff --git a/pkg/buildah/docker_with_fuse_buildah.go b/pkg/buildah/docker_with_fuse_buildah.go index 2a58b3f302..0b808b7448 100644 --- a/pkg/buildah/docker_with_fuse_buildah.go +++ b/pkg/buildah/docker_with_fuse_buildah.go @@ -62,13 +62,23 @@ func (b *DockerWithFuseBuildah) BuildFromDockerfile(ctx context.Context, dockerf } }() + var buildArgs []string + for k, v := range opts.BuildArgs { + buildArgs = append(buildArgs, "--build-arg", fmt.Sprintf("%s=%s", k, v)) + } + + // NOTE: it is principal to use cli option --tls-verify=true|false form with equality sign, instead of separate arguments (--tls-verify true|false), because --tls-verify is by itself a boolean argument + budArgs := []string{"bud", "--format", "docker", fmt.Sprintf("--tls-verify=%s", strconv.FormatBool(!b.Insecure))} + budArgs = append(budArgs, buildArgs...) + budArgs = append(budArgs, "-f", "/.werf/buildah/tmp/Dockerfile") + output, _, err := b.runBuildah( ctx, []string{ "--volume", fmt.Sprintf("%s:/.werf/buildah/tmp", sessionTmpDir), "--workdir", "/.werf/buildah/tmp/context", }, - []string{"bud", "--format=docker", fmt.Sprintf("--tls-verify=%s", strconv.FormatBool(!b.Insecure)), "-f", "/.werf/buildah/tmp/Dockerfile"}, opts.LogWriter, + budArgs, opts.LogWriter, ) if err != nil { return "", err diff --git a/pkg/buildah/native_rootless_buildah_linux.go b/pkg/buildah/native_rootless_buildah_linux.go index 11e3c4d7c2..938c59384e 100644 --- a/pkg/buildah/native_rootless_buildah_linux.go +++ b/pkg/buildah/native_rootless_buildah_linux.go @@ -153,6 +153,7 @@ func (b *NativeRootlessBuildah) BuildFromDockerfile(ctx context.Context, dockerf DockerInsecureSkipTLSVerify: imgtypes.NewOptionalBool(b.Insecure), DockerDaemonInsecureSkipTLSVerify: b.Insecure, }, + Args: opts.BuildArgs, } errLog := &bytes.Buffer{} @@ -184,7 +185,7 @@ func (b *NativeRootlessBuildah) BuildFromDockerfile(ctx context.Context, dockerf func (b *NativeRootlessBuildah) RunCommand(ctx context.Context, container string, command []string, opts RunCommandOpts) error { runOpts := buildah.RunOptions{ - Args: opts.BuildArgs, + Args: opts.Args, } stderr := &bytes.Buffer{} diff --git a/pkg/container_runtime/buildah_runtime.go b/pkg/container_runtime/buildah_runtime.go index 7a40245b26..f1df89aa25 100644 --- a/pkg/container_runtime/buildah_runtime.go +++ b/pkg/container_runtime/buildah_runtime.go @@ -3,6 +3,7 @@ package container_runtime import ( "context" "fmt" + "strings" "github.com/werf/logboek" "github.com/werf/werf/pkg/buildah" @@ -81,11 +82,21 @@ func (runtime *BuildahRuntime) Push(ctx context.Context, ref string, opts PushOp } func (runtime *BuildahRuntime) BuildDockerfile(ctx context.Context, dockerfile []byte, opts BuildDockerfileOpts) (string, error) { + buildArgs := make(map[string]string) + for _, argStr := range opts.BuildArgs { + argParts := strings.SplitN(argStr, "=", 2) + if len(argParts) < 2 { + return "", fmt.Errorf("invalid build argument %q given, expected string in the key=value format", argStr) + } + buildArgs[argParts[0]] = argParts[1] + } + return runtime.buildah.BuildFromDockerfile(ctx, dockerfile, buildah.BuildFromDockerfileOpts{ CommonOpts: buildah.CommonOpts{ LogWriter: logboek.Context(ctx).OutStream(), }, ContextTar: opts.ContextTar, + BuildArgs: buildArgs, }) }