diff --git a/integration/dockerfiles/Dockerfile_test_pre_defined_build_args b/integration/dockerfiles/Dockerfile_test_pre_defined_build_args new file mode 100644 index 000000000..e4a08f79e --- /dev/null +++ b/integration/dockerfiles/Dockerfile_test_pre_defined_build_args @@ -0,0 +1,46 @@ +# ingegration test for pre-defined build args; see pkg/dockerfile/buildargs.go +FROM alpine:3 AS builder +ARG BUILDPLATFORM +ARG BUILDOS +ARG BUILDARCH +ARG BUILDVARIANT +ARG TARGETPLATFORM +ARG TARGETOS +ARG TARGETARCH +ARG TARGETVARIANT +ARG TARGETSTAGE +RUN echo "BUILDPLATFORM: ${BUILDPLATFORM}" && \ + echo "BUILDOS: ${BUILDOS}" && \ + echo "BUILDARCH: ${BUILDARCH}" && \ + echo "BUILDVARIANT: ${BUILDVARIANT}" && \ + echo "TARGETPLATFORM: ${TARGETPLATFORM}" && \ + echo "TARGETOS: ${TARGETOS}" && \ + echo "TARGETARCH: ${TARGETARCH}" && \ + echo "TARGETVARIANT: ${TARGETVARIANT}" && \ + echo "TARGETSTAGE: ${TARGETSTAGE}" +RUN uname -a +COPY foo /app/foo +RUN echo 'add line' >> /app/foo + +FROM alpine:3 +COPY --from=builder /app/foo /app/foo +ARG BUILDPLATFORM +ARG BUILDOS +ARG BUILDARCH +ARG BUILDVARIANT +ARG TARGETPLATFORM +ARG TARGETOS +ARG TARGETARCH +ARG TARGETVARIANT +ARG TARGETSTAGE +RUN echo "BUILDPLATFORM: ${BUILDPLATFORM}" && \ + echo "BUILDOS: ${BUILDOS}" && \ + echo "BUILDARCH: ${BUILDARCH}" && \ + echo "BUILDVARIANT: ${BUILDVARIANT}" && \ + echo "TARGETPLATFORM: ${TARGETPLATFORM}" && \ + echo "TARGETOS: ${TARGETOS}" && \ + echo "TARGETARCH: ${TARGETARCH}" && \ + echo "TARGETVARIANT: ${TARGETVARIANT}" && \ + echo "TARGETSTAGE: ${TARGETSTAGE}" +RUN uname -a +RUN cat /app/foo \ No newline at end of file diff --git a/pkg/dockerfile/buildargs.go b/pkg/dockerfile/buildargs.go index 9b5dc3476..be7f5d847 100644 --- a/pkg/dockerfile/buildargs.go +++ b/pkg/dockerfile/buildargs.go @@ -17,14 +17,21 @@ limitations under the License. package dockerfile import ( - "runtime" + "fmt" "strings" + "sync" "github.com/GoogleContainerTools/kaniko/pkg/config" + "github.com/containerd/platforms" d "github.com/docker/docker/builder/dockerfile" + containerregistryV1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/instructions" + "github.com/sirupsen/logrus" ) +var defaultArgsOnce sync.Once +var defaultArgs []string + type BuildArgs struct { d.BuildArgs } @@ -71,41 +78,44 @@ func (b *BuildArgs) AddMetaArgs(metaArgs []instructions.ArgCommand) { } } -// AddPreDefinedBuildArgs adds pre-defined build args. Such as TARGETOS, TARGETARCH, BUILDPLATFORM, TARGETPLATFORM -func (b *BuildArgs) AddPreDefinedBuildArgs(opts *config.KanikoOptions) { - buildPlatform := runtime.GOOS + "/" + runtime.GOARCH - buildOs := runtime.GOOS - buildArch := runtime.GOARCH - - targetPlatform := "" - targetOs := "" - targetArch := "" - targetVariant := "" - - if opts.CustomPlatform == "" { - targetPlatform = buildPlatform - targetOs = buildOs - targetArch = buildArch - } else { - targetPlatform = opts.CustomPlatform - platformParts := strings.Split(opts.CustomPlatform, "/") - if len(platformParts) > 0 { - targetOs = platformParts[0] +// DefaultArgs get default args. +// include pre-defined build args: TARGETOS, TARGETARCH, BUILDPLATFORM, TARGETPLATFORM ... +func DefaultArgs(opt config.KanikoOptions) []string { + defaultArgsOnce.Do(func() { + // build info + buildPlatform := platforms.Format(platforms.Normalize(platforms.DefaultSpec())) + buildPlatformSpec, err := containerregistryV1.ParsePlatform(buildPlatform) + if err != nil { + logrus.Fatalf("Parse build platform %q: %v", buildPlatform, err) } - if len(platformParts) > 1 { - targetArch = platformParts[1] - } - if len(platformParts) > 2 { - targetVariant = platformParts[2] - } - } - b.AddArg("BUILDPLATFORM", &buildPlatform) - b.AddArg("BUILDOS", &buildOs) - b.AddArg("BUILDARCH", &buildArch) + // target info + var targetPlatform string + if opt.CustomPlatform != "" { + targetPlatform = opt.CustomPlatform + } else { + targetPlatform = buildPlatform + } + targetPlatformSpec, err := containerregistryV1.ParsePlatform(opt.CustomPlatform) + if err != nil { + logrus.Fatalf("Invalid platform %q: %v", opt.CustomPlatform, err) + } - b.AddArg("TARGETPLATFORM", &targetPlatform) - b.AddArg("TARGETOS", &targetOs) - b.AddArg("TARGETARCH", &targetArch) - b.AddArg("TARGETVARIANT", &targetVariant) + // pre-defined build args + defaultArgs = []string{ + fmt.Sprintf("%s=%s", "BUILDPLATFORM", buildPlatform), + fmt.Sprintf("%s=%s", "BUILDOS", buildPlatformSpec.OS), + fmt.Sprintf("%s=%s", "BUILDOSVERSION", buildPlatformSpec.OSVersion), + fmt.Sprintf("%s=%s", "BUILDARCH", buildPlatformSpec.Architecture), + fmt.Sprintf("%s=%s", "BUILDVARIANT", buildPlatformSpec.Variant), + fmt.Sprintf("%s=%s", "TARGETPLATFORM", targetPlatform), + fmt.Sprintf("%s=%s", "TARGETOS", targetPlatformSpec.OS), + fmt.Sprintf("%s=%s", "TARGETOSVERSION", targetPlatformSpec.OSVersion), + fmt.Sprintf("%s=%s", "TARGETARCH", targetPlatformSpec.Architecture), + fmt.Sprintf("%s=%s", "TARGETVARIANT", targetPlatformSpec.Variant), + fmt.Sprintf("%s=%s", "TARGETSTAGE", opt.Target), + } + logrus.Infof("init default args: %s", defaultArgs) + }) + return defaultArgs } diff --git a/pkg/executor/build.go b/pkg/executor/build.go index 0b3738c2d..fd5e5c224 100644 --- a/pkg/executor/build.go +++ b/pkg/executor/build.go @@ -146,10 +146,11 @@ func newStageBuilder(args *dockerfile.BuildArgs, opts *config.KanikoOptions, sta if args != nil { s.args = args.Clone() } else { - s.args = dockerfile.NewBuildArgs(s.opts.BuildArgs) + defaultArgs := dockerfile.DefaultArgs(*opts) + mergedArgs := append(defaultArgs, s.opts.BuildArgs...) + s.args = dockerfile.NewBuildArgs(mergedArgs) } s.args.AddMetaArgs(s.stage.MetaArgs) - s.args.AddPreDefinedBuildArgs(opts) return s, nil }