Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Correctly ignore files from .dockerignore #508

Merged
merged 14 commits into from
Mar 7, 2023
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 19 additions & 1 deletion provider/image.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ import (
controlapi "github.com/moby/buildkit/api/services/control"
"github.com/pulumi/pulumi/sdk/v3/go/common/resource"
"github.com/pulumi/pulumi/sdk/v3/go/common/resource/plugin"

buildCmd "github.com/docker/cli/cli/command/image/build"
)

const defaultDockerfile = "Dockerfile"
Expand Down Expand Up @@ -93,13 +95,29 @@ func (p *dockerNativeProvider) dockerBuild(ctx context.Context,
// make the build context and ensure to exclude dockerignore file patterns
dockerIgnorePath := filepath.Join(build.Context, ".dockerignore")
ignorePatterns, err := getIgnore(dockerIgnorePath)
ignorePatterns = buildCmd.TrimBuildFilesFromExcludes(ignorePatterns, img.Build.Dockerfile, false)

// warn user about accidentally copying build files
if build.BuilderVersion == defaultBuilder {
for _, pattern := range ignorePatterns {
if pattern == "!Dockerfile" || pattern == "!.Dockerignore" {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure if these patterns will fire - .dockerignore is typically lowercase.

Rather than try to check if the pattern matches, should we store the ignorePatterns on line 97 in a different variable from the return value of buildCmd.TrimBuildFilesFromExcludes and check len(before) != len(after)?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

	ignorePatterns, err := getIgnore(dockerIgnorePath)
	// copy ignore patterns to compare
	initialIgnorePatterns := append([]string, ignorePatterns...)
	
	ignorePatterns = buildCmd.TrimBuildFilesFromExcludes(ignorePatterns, img.Build.Dockerfile, false)

	// warn user about accidentally copying build files, link to GitHub Issue: 
	if build.BuilderVersion == defaultBuilder && len(initialIgnorePatterns) != len(ignorePatterns) {

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oooh, I like it! good idea!

msg := "It looks like you are trying to dockerignore a build file such as Dockerfile or .dockerignore. " +
"Due to limitations when running this provider in Buildkit mode, your build files may get copied " +
"into your image. Please ensure any copied file systems do not include build files."
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This only applies to .dockerignore and the Dockerfile. Perhaps we should tone this message down, that seems very low impact.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

how is this?

err = p.host.Log(ctx, "warning", urn, msg)
if err != nil {
return "", nil, err
}
}
}
}

if err != nil {
return "", nil, err
}

tar, err := archive.TarWithOptions(img.Build.Context, &archive.TarOptions{
ExcludePatterns: ignorePatterns,
IncludeFiles: []string{".", img.Build.Dockerfile, ".dockerignore"},
})
if err != nil {
return "", nil, err
Expand Down