e0ef11a4c2
This patch creates interfaces in builder/ for building Docker images. It is a first step in a series of patches to remove the daemon dependency on builder and later allow a client-side Dockerfile builder as well as potential builder plugins. It is needed because we cannot remove the /build API endpoint, so we need to keep the server-side Dockerfile builder, but we also want to reuse the same Dockerfile parser and evaluator for both server-side and client-side. builder/dockerfile/ and api/server/builder.go contain implementations of those interfaces as a refactoring of the current code. Signed-off-by: Tibor Vass <tibor@docker.com>
47 lines
1.6 KiB
Go
47 lines
1.6 KiB
Go
package builder
|
|
|
|
import (
|
|
"os"
|
|
|
|
"github.com/docker/docker/pkg/fileutils"
|
|
"github.com/docker/docker/utils"
|
|
)
|
|
|
|
// DockerIgnoreContext wraps a ModifiableContext to add a method
|
|
// for handling the .dockerignore file at the root of the context.
|
|
type DockerIgnoreContext struct {
|
|
ModifiableContext
|
|
}
|
|
|
|
// Process reads the .dockerignore file at the root of the embedded context.
|
|
// If .dockerignore does not exist in the context, then nil is returned.
|
|
//
|
|
// It can take a list of files to be removed after .dockerignore is removed.
|
|
// This is used for server-side implementations of builders that need to send
|
|
// the .dockerignore file as well as the special files specified in filesToRemove,
|
|
// but expect them to be excluded from the context after they were processed.
|
|
//
|
|
// For example, server-side Dockerfile builders are expected to pass in the name
|
|
// of the Dockerfile to be removed after it was parsed.
|
|
//
|
|
// TODO: Don't require a ModifiableContext (use Context instead) and don't remove
|
|
// files, instead handle a list of files to be excluded from the context.
|
|
func (c DockerIgnoreContext) Process(filesToRemove []string) error {
|
|
dockerignore, err := c.Open(".dockerignore")
|
|
// Note that a missing .dockerignore file isn't treated as an error
|
|
if err != nil {
|
|
if os.IsNotExist(err) {
|
|
return nil
|
|
}
|
|
return err
|
|
}
|
|
excludes, _ := utils.ReadDockerIgnore(dockerignore)
|
|
filesToRemove = append([]string{".dockerignore"}, filesToRemove...)
|
|
for _, fileToRemove := range filesToRemove {
|
|
rm, _ := fileutils.Matches(fileToRemove, excludes)
|
|
if rm {
|
|
c.Remove(fileToRemove)
|
|
}
|
|
}
|
|
return nil
|
|
}
|