Merge pull request #274 from vdemeester/remove-shell-parser
Remove shell parser for dockerfile2llb, using moby upstream packagedocker-18.09
commit
6d2595c6fe
|
@ -15,6 +15,7 @@ import (
|
|||
"github.com/docker/distribution/reference"
|
||||
"github.com/docker/docker/builder/dockerfile/instructions"
|
||||
"github.com/docker/docker/builder/dockerfile/parser"
|
||||
"github.com/docker/docker/builder/dockerfile/shell"
|
||||
"github.com/docker/docker/pkg/signal"
|
||||
"github.com/docker/go-connections/nat"
|
||||
"github.com/moby/buildkit/client/llb"
|
||||
|
@ -59,7 +60,7 @@ func Dockerfile2LLB(ctx context.Context, dt []byte, opt ConvertOpt) (*llb.State,
|
|||
metaArgs[i] = setBuildArgValue(metaArgs[i], opt.BuildArgs)
|
||||
}
|
||||
|
||||
shlex := NewShellLex(dockerfile.EscapeToken)
|
||||
shlex := shell.NewLex(dockerfile.EscapeToken)
|
||||
|
||||
metaResolver := opt.MetaResolver
|
||||
if metaResolver == nil {
|
||||
|
@ -232,7 +233,7 @@ type dispatchOpt struct {
|
|||
dispatchStatesByName map[string]*dispatchState
|
||||
metaArgs []instructions.ArgCommand
|
||||
buildArgValues map[string]string
|
||||
shlex *ShellLex
|
||||
shlex *shell.Lex
|
||||
sessionID string
|
||||
buildContext llb.State
|
||||
}
|
||||
|
@ -491,7 +492,7 @@ func dispatchHealthcheck(d *dispatchState, c *instructions.HealthCheckCommand) e
|
|||
return commitToHistory(&d.image, fmt.Sprintf("HEALTHCHECK %q", d.image.Config.Healthcheck), false, nil)
|
||||
}
|
||||
|
||||
func dispatchExpose(d *dispatchState, c *instructions.ExposeCommand, shlex *ShellLex) error {
|
||||
func dispatchExpose(d *dispatchState, c *instructions.ExposeCommand, shlex *shell.Lex) error {
|
||||
ports := []string{}
|
||||
for _, p := range c.Ports {
|
||||
ps, err := shlex.ProcessWords(p, toEnvList(d.buildArgs, d.image.Config.Env))
|
||||
|
@ -516,6 +517,7 @@ func dispatchExpose(d *dispatchState, c *instructions.ExposeCommand, shlex *Shel
|
|||
|
||||
return commitToHistory(&d.image, fmt.Sprintf("EXPOSE %v", ps), false, nil)
|
||||
}
|
||||
|
||||
func dispatchUser(d *dispatchState, c *instructions.UserCommand, commit bool) error {
|
||||
d.state = d.state.User(c.User)
|
||||
d.image.Config.User = c.User
|
||||
|
@ -601,7 +603,7 @@ func addEnv(env []string, k, v string, override bool) []string {
|
|||
for i, envVar := range env {
|
||||
envParts := strings.SplitN(envVar, "=", 2)
|
||||
compareFrom := envParts[0]
|
||||
if equalEnvKeys(compareFrom, k) {
|
||||
if shell.EqualEnvKeys(compareFrom, k) {
|
||||
if override {
|
||||
env[i] = k + "=" + v
|
||||
}
|
||||
|
@ -615,10 +617,6 @@ func addEnv(env []string, k, v string, override bool) []string {
|
|||
return env
|
||||
}
|
||||
|
||||
func equalEnvKeys(from, to string) bool {
|
||||
return from == to
|
||||
}
|
||||
|
||||
func setBuildArgValue(c instructions.ArgCommand, values map[string]string) instructions.ArgCommand {
|
||||
if v, ok := values[c.Key]; ok {
|
||||
c.Value = &v
|
||||
|
|
9
vendor/github.com/docker/docker/builder/dockerfile/shell/equal_env_unix.go
generated
vendored
Normal file
9
vendor/github.com/docker/docker/builder/dockerfile/shell/equal_env_unix.go
generated
vendored
Normal file
|
@ -0,0 +1,9 @@
|
|||
// +build !windows
|
||||
|
||||
package shell
|
||||
|
||||
// EqualEnvKeys compare two strings and returns true if they are equal. On
|
||||
// Windows this comparison is case insensitive.
|
||||
func EqualEnvKeys(from, to string) bool {
|
||||
return from == to
|
||||
}
|
9
vendor/github.com/docker/docker/builder/dockerfile/shell/equal_env_windows.go
generated
vendored
Normal file
9
vendor/github.com/docker/docker/builder/dockerfile/shell/equal_env_windows.go
generated
vendored
Normal file
|
@ -0,0 +1,9 @@
|
|||
package shell
|
||||
|
||||
import "strings"
|
||||
|
||||
// EqualEnvKeys compare two strings and returns true if they are equal. On
|
||||
// Windows this comparison is case insensitive.
|
||||
func EqualEnvKeys(from, to string) bool {
|
||||
return strings.ToUpper(from) == strings.ToUpper(to)
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package dockerfile2llb
|
||||
package shell
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
|
@ -9,27 +9,25 @@ import (
|
|||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
// copied from moby/moby. Should be replaced by other utility package or turned into a special package.
|
||||
|
||||
// ShellLex performs shell word splitting and variable expansion.
|
||||
// Lex performs shell word splitting and variable expansion.
|
||||
//
|
||||
// ShellLex takes a string and an array of env variables and
|
||||
// Lex takes a string and an array of env variables and
|
||||
// process all quotes (" and ') as well as $xxx and ${xxx} env variable
|
||||
// tokens. Tries to mimic bash shell process.
|
||||
// It doesn't support all flavors of ${xx:...} formats but new ones can
|
||||
// be added by adding code to the "special ${} format processing" section
|
||||
type ShellLex struct {
|
||||
type Lex struct {
|
||||
escapeToken rune
|
||||
}
|
||||
|
||||
// NewShellLex creates a new ShellLex which uses escapeToken to escape quotes.
|
||||
func NewShellLex(escapeToken rune) *ShellLex {
|
||||
return &ShellLex{escapeToken: escapeToken}
|
||||
// NewLex creates a new Lex which uses escapeToken to escape quotes.
|
||||
func NewLex(escapeToken rune) *Lex {
|
||||
return &Lex{escapeToken: escapeToken}
|
||||
}
|
||||
|
||||
// ProcessWord will use the 'env' list of environment variables,
|
||||
// and replace any env var references in 'word'.
|
||||
func (s *ShellLex) ProcessWord(word string, env []string) (string, error) {
|
||||
func (s *Lex) ProcessWord(word string, env []string) (string, error) {
|
||||
word, _, err := s.process(word, env)
|
||||
return word, err
|
||||
}
|
||||
|
@ -41,12 +39,12 @@ func (s *ShellLex) ProcessWord(word string, env []string) (string, error) {
|
|||
// this splitting is done **after** the env var substitutions are done.
|
||||
// Note, each one is trimmed to remove leading and trailing spaces (unless
|
||||
// they are quoted", but ProcessWord retains spaces between words.
|
||||
func (s *ShellLex) ProcessWords(word string, env []string) ([]string, error) {
|
||||
func (s *Lex) ProcessWords(word string, env []string) ([]string, error) {
|
||||
_, words, err := s.process(word, env)
|
||||
return words, err
|
||||
}
|
||||
|
||||
func (s *ShellLex) process(word string, env []string) (string, []string, error) {
|
||||
func (s *Lex) process(word string, env []string) (string, []string, error) {
|
||||
sw := &shellWord{
|
||||
envs: env,
|
||||
escapeToken: s.escapeToken,
|
||||
|
@ -329,7 +327,7 @@ func (sw *shellWord) getEnv(name string) string {
|
|||
for _, env := range sw.envs {
|
||||
i := strings.Index(env, "=")
|
||||
if i < 0 {
|
||||
if equalEnvKeys(name, env) {
|
||||
if EqualEnvKeys(name, env) {
|
||||
// Should probably never get here, but just in case treat
|
||||
// it like "var" and "var=" are the same
|
||||
return ""
|
||||
|
@ -337,7 +335,7 @@ func (sw *shellWord) getEnv(name string) string {
|
|||
continue
|
||||
}
|
||||
compareName := env[:i]
|
||||
if !equalEnvKeys(name, compareName) {
|
||||
if !EqualEnvKeys(name, compareName) {
|
||||
continue
|
||||
}
|
||||
return env[i+1:]
|
Loading…
Reference in New Issue