Merge pull request #901 from tonistiigi/dockerfile-ignore

dockerfile: add dockerignore override support
docker-19.03
Tibor Vass 2019-03-25 17:14:47 -07:00 committed by GitHub
commit b9db1d242b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 81 additions and 7 deletions

View File

@ -113,7 +113,7 @@ func Build(ctx context.Context, c client.Client) (*client.Result, error) {
name := "load build definition from " + filename name := "load build definition from " + filename
src := llb.Local(localNameDockerfile, src := llb.Local(localNameDockerfile,
llb.FollowPaths([]string{filename}), llb.FollowPaths([]string{filename, filename + ".dockerignore"}),
llb.SessionID(c.BuildOpts().SessionID), llb.SessionID(c.BuildOpts().SessionID),
llb.SharedKeyHint(localNameDockerfile), llb.SharedKeyHint(localNameDockerfile),
dockerfile2llb.WithInternalName(name), dockerfile2llb.WithInternalName(name),
@ -175,6 +175,8 @@ func Build(ctx context.Context, c client.Client) (*client.Result, error) {
eg, ctx2 := errgroup.WithContext(ctx) eg, ctx2 := errgroup.WithContext(ctx)
var dtDockerfile []byte var dtDockerfile []byte
var dtDockerignore []byte
var dtDockerignoreDefault []byte
eg.Go(func() error { eg.Go(func() error {
res, err := c.Solve(ctx2, client.SolveRequest{ res, err := c.Solve(ctx2, client.SolveRequest{
Definition: def.ToPB(), Definition: def.ToPB(),
@ -194,6 +196,13 @@ func Build(ctx context.Context, c client.Client) (*client.Result, error) {
if err != nil { if err != nil {
return errors.Wrapf(err, "failed to read dockerfile") return errors.Wrapf(err, "failed to read dockerfile")
} }
dt, err := ref.ReadFile(ctx2, client.ReadRequest{
Filename: filename + ".dockerignore",
})
if err == nil {
dtDockerignore = dt
}
return nil return nil
}) })
var excludes []string var excludes []string
@ -223,14 +232,11 @@ func Build(ctx context.Context, c client.Client) (*client.Result, error) {
if err != nil { if err != nil {
return err return err
} }
dtDockerignore, err := ref.ReadFile(ctx2, client.ReadRequest{ dtDockerignoreDefault, err = ref.ReadFile(ctx2, client.ReadRequest{
Filename: dockerignoreFilename, Filename: dockerignoreFilename,
}) })
if err == nil { if err != nil {
excludes, err = dockerignore.ReadAll(bytes.NewBuffer(dtDockerignore)) return nil
if err != nil {
return errors.Wrap(err, "failed to parse dockerignore")
}
} }
return nil return nil
}) })
@ -240,6 +246,16 @@ func Build(ctx context.Context, c client.Client) (*client.Result, error) {
return nil, err return nil, err
} }
if dtDockerignore == nil {
dtDockerignore = dtDockerignoreDefault
}
if dtDockerignore != nil {
excludes, err = dockerignore.ReadAll(bytes.NewBuffer(dtDockerignore))
if err != nil {
return nil, errors.Wrap(err, "failed to parse dockerignore")
}
}
if _, ok := opts["cmdline"]; !ok { if _, ok := opts["cmdline"]; !ok {
ref, cmdline, ok := dockerfile2llb.DetectSyntax(bytes.NewBuffer(dtDockerfile)) ref, cmdline, ok := dockerfile2llb.DetectSyntax(bytes.NewBuffer(dtDockerfile))
if ok { if ok {

View File

@ -78,6 +78,7 @@ var allTests = []integration.Test{
testDockerfileAddArchiveWildcard, testDockerfileAddArchiveWildcard,
testCopyChownExistingDir, testCopyChownExistingDir,
testCopyWildcardCache, testCopyWildcardCache,
testDockerignoreOverride,
} }
var fileOpTests = []integration.Test{ var fileOpTests = []integration.Test{
@ -138,6 +139,63 @@ func TestIntegration(t *testing.T) {
}))...) }))...)
} }
func testDockerignoreOverride(t *testing.T, sb integration.Sandbox) {
f := getFrontend(t, sb)
dockerfile := []byte(`
FROM busybox
COPY . .
RUN [ -f foo ] && [ ! -f bar ]
`)
ignore := []byte(`
bar
`)
dockerfile2 := []byte(`
FROM busybox
COPY . .
RUN [ ! -f foo ] && [ -f bar ]
`)
ignore2 := []byte(`
foo
`)
dir, err := tmpdir(
fstest.CreateFile("Dockerfile", dockerfile, 0600),
fstest.CreateFile("Dockerfile.dockerignore", ignore, 0600),
fstest.CreateFile("Dockerfile2", dockerfile2, 0600),
fstest.CreateFile("Dockerfile2.dockerignore", ignore2, 0600),
fstest.CreateFile("foo", []byte("contents0"), 0600),
fstest.CreateFile("bar", []byte("contents0"), 0600),
)
require.NoError(t, err)
defer os.RemoveAll(dir)
c, err := client.New(context.TODO(), sb.Address())
require.NoError(t, err)
defer c.Close()
_, err = f.Solve(context.TODO(), c, client.SolveOpt{
LocalDirs: map[string]string{
builder.DefaultLocalNameDockerfile: dir,
builder.DefaultLocalNameContext: dir,
},
}, nil)
require.NoError(t, err)
_, err = f.Solve(context.TODO(), c, client.SolveOpt{
FrontendAttrs: map[string]string{
"filename": "Dockerfile2",
},
LocalDirs: map[string]string{
builder.DefaultLocalNameDockerfile: dir,
builder.DefaultLocalNameContext: dir,
},
}, nil)
require.NoError(t, err)
}
func testEmptyDestDir(t *testing.T, sb integration.Sandbox) { func testEmptyDestDir(t *testing.T, sb integration.Sandbox) {
f := getFrontend(t, sb) f := getFrontend(t, sb)
isFileOp := getFileOp(t, sb) isFileOp := getFileOp(t, sb)