From c5f2f4840fd07a47e5599e974f7d32be0717d1f7 Mon Sep 17 00:00:00 2001 From: Talon Bowler Date: Tue, 9 Jul 2024 17:39:05 -0700 Subject: [PATCH] no CopyIgnoreFile rule when copying from parent stage Signed-off-by: Talon Bowler --- frontend/dockerfile/dockerfile2llb/convert.go | 6 ++++++ frontend/dockerui/config.go | 6 ++++++ frontend/dockerui/context.go | 2 ++ 3 files changed, 14 insertions(+) diff --git a/frontend/dockerfile/dockerfile2llb/convert.go b/frontend/dockerfile/dockerfile2llb/convert.go index 8f63f8c74b88e..1b801be583e9d 100644 --- a/frontend/dockerfile/dockerfile2llb/convert.go +++ b/frontend/dockerfile/dockerfile2llb/convert.go @@ -962,6 +962,7 @@ func dispatch(d *dispatchState, cmd command, opt dispatchOpt) error { params: c.SourcesAndDest, excludePatterns: c.ExcludePatterns, source: l, + fromStage: c.From, isAddCommand: false, cmdToPrint: c, chown: c.Chown, @@ -1564,6 +1565,7 @@ type copyConfig struct { cmdToPrint fmt.Stringer chown string chmod string + fromStage string link bool keepGitDir bool checksum digest.Digest @@ -1883,6 +1885,10 @@ func addReachableStages(s *dispatchState, stages map[*dispatchState]struct{}) { } func validateCopySourcePath(matcher *patternmatcher.PatternMatcher, src string, cfg *copyConfig, lint *linter.Linter) error { + if cfg.fromStage != "" { + return nil + } + cmd := "Copy" if cfg.isAddCommand { cmd = "Add" diff --git a/frontend/dockerui/config.go b/frontend/dockerui/config.go index fda64a05fb0df..d341582de586f 100644 --- a/frontend/dockerui/config.go +++ b/frontend/dockerui/config.go @@ -411,6 +411,9 @@ func (bc *Client) MainContext(ctx context.Context, opts ...llb.LocalOption) (*ll } excludes, err := bc.dockerIgnorePatterns(ctx, bctx) + if err != nil { + return nil, errors.Wrapf(err, "failed to read dockerignore patterns") + } opts = append([]llb.LocalOption{ llb.SessionID(bc.bopts.SessionID), @@ -460,6 +463,9 @@ func (bc *Client) DockerIgnorePatterns(ctx context.Context) ([]string, error) { if err != nil { return nil, err } + if !bctx.localBuild { + return nil, nil + } return bc.dockerIgnorePatterns(ctx, bctx) } diff --git a/frontend/dockerui/context.go b/frontend/dockerui/context.go index 3173558fd67f7..377f1b7b4441e 100644 --- a/frontend/dockerui/context.go +++ b/frontend/dockerui/context.go @@ -39,6 +39,7 @@ type buildContext struct { dockerfileLocalName string filename string forceLocalDockerfile bool + localBuild bool } func (bc *Client) marshalOpts() []llb.ConstraintsOpt { @@ -113,6 +114,7 @@ func (bc *Client) initContext(ctx context.Context) (*buildContext, error) { } bctx.dockerfile = bctx.context } else if (&gwcaps).Supports(gwpb.CapFrontendInputs) == nil { + bctx.localBuild = true inputs, err := bc.client.Inputs(ctx) if err != nil { return nil, errors.Wrapf(err, "failed to get frontend inputs")