Replaced shlex with dockerfile/shell package
This commit is contained in:
parent
e84ebcc494
commit
f33e507018
|
|
@ -13,3 +13,7 @@ ENV test2='a"b"c'
|
|||
ENV test3=a\ b name2=b\ c
|
||||
ENV test4="a\"b"
|
||||
ENV test5='a\"b'
|
||||
ENV test6="a\'b"
|
||||
ENV atomic=one
|
||||
ENV atomic=two newatomic=$atomic
|
||||
ENV newenv=$doesntexist/newenv
|
||||
|
|
|
|||
|
|
@ -31,3 +31,11 @@ metadataTest:
|
|||
value: a"b
|
||||
- key: test5
|
||||
value: a\"b
|
||||
- key: test6
|
||||
value: a\'b
|
||||
- key: atomic
|
||||
value: two
|
||||
- key: newatomic
|
||||
value: one
|
||||
- key: newenv
|
||||
value: /newenv
|
||||
|
|
|
|||
|
|
@ -17,9 +17,10 @@ limitations under the License.
|
|||
package commands
|
||||
|
||||
import (
|
||||
"github.com/GoogleCloudPlatform/k8s-container-builder/pkg/dockerfile"
|
||||
"github.com/containers/image/manifest"
|
||||
"github.com/docker/docker/builder/dockerfile/instructions"
|
||||
"github.com/google/shlex"
|
||||
"github.com/docker/docker/builder/dockerfile/shell"
|
||||
"github.com/sirupsen/logrus"
|
||||
"os"
|
||||
"strings"
|
||||
|
|
@ -33,14 +34,23 @@ func (e *EnvCommand) ExecuteCommand(config *manifest.Schema2Config) error {
|
|||
logrus.Info("cmd: ENV")
|
||||
newEnvs := e.cmd.Env
|
||||
for index, pair := range newEnvs {
|
||||
newVal := os.Expand(pair.Value, os.Getenv)
|
||||
tokens, _ := shlex.Split(newVal)
|
||||
// The dockerfile/shell package handles processing env values
|
||||
// It handles escape characters and supports expansion from the config.Env array
|
||||
// Shlex handles some of the following use cases (these and more are tested in integration tests)
|
||||
// ""a'b'c"" -> "a'b'c"
|
||||
// "Rex\ The\ Dog \" -> "Rex The Dog"
|
||||
// "a\"b" -> "a"b"
|
||||
shlex := shell.NewLex(dockerfile.EscapeToken)
|
||||
expandedValue, err := shlex.ProcessWord(pair.Value, config.Env)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
newEnvs[index] = instructions.KeyValuePair{
|
||||
Key: pair.Key,
|
||||
Value: strings.Join(tokens, " "),
|
||||
Value: expandedValue,
|
||||
}
|
||||
logrus.Infof("Setting environment variable %s=%s", pair.Key, pair.Value)
|
||||
if err := os.Setenv(pair.Key, pair.Value); err != nil {
|
||||
logrus.Infof("Setting environment variable %s=%s", pair.Key, expandedValue)
|
||||
if err := os.Setenv(pair.Key, expandedValue); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,12 +23,15 @@ import (
|
|||
"github.com/docker/docker/builder/dockerfile/parser"
|
||||
)
|
||||
|
||||
var EscapeToken rune
|
||||
|
||||
// Parse parses the contents of a Dockerfile and returns a list of commands
|
||||
func Parse(b []byte) ([]instructions.Stage, error) {
|
||||
p, err := parser.Parse(bytes.NewReader(b))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
EscapeToken = p.EscapeToken
|
||||
stages, _, err := instructions.Parse(p.AST)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
|
|
|||
Loading…
Reference in New Issue