1
0
Fork 0
mirror of https://github.com/moby/moby.git synced 2022-11-09 12:21:53 -05:00

Fixes 1136; Reopened from 1175 with latest changes.

This commit is contained in:
Fareed Dudhia 2013-07-09 07:01:45 +00:00
parent 7df6c4b9ad
commit d86898b014
3 changed files with 103 additions and 15 deletions

View file

@ -11,6 +11,7 @@ import (
"os" "os"
"path" "path"
"reflect" "reflect"
"regexp"
"strings" "strings"
) )
@ -67,6 +68,9 @@ func (b *buildFile) CmdFrom(name string) error {
} }
b.image = image.ID b.image = image.ID
b.config = &Config{} b.config = &Config{}
if b.config.Env == nil || len(b.config.Env) == 0 {
b.config.Env = append(b.config.Env, "HOME=/", "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin")
}
return nil return nil
} }
@ -112,6 +116,40 @@ func (b *buildFile) CmdRun(args string) error {
return nil return nil
} }
func (b *buildFile) FindEnvKey(key string) int {
for k, envVar := range b.config.Env {
envParts := strings.SplitN(envVar, "=", 2)
if key == envParts[0] {
return k
}
}
return -1
}
func (b *buildFile) ReplaceEnvMatches(value string) (string, error) {
exp, err := regexp.Compile("(\\\\\\\\+|[^\\\\]|\\b|\\A)\\$({?)([[:alnum:]_]+)(}?)")
if err != nil {
return value, err
}
matches := exp.FindAllString(value, -1)
for _, match := range matches {
match = match[strings.Index(match, "$"):]
matchKey := strings.Trim(match, "${}")
for _, envVar := range b.config.Env {
envParts := strings.SplitN(envVar, "=", 2)
envKey := envParts[0]
envValue := envParts[1]
if envKey == matchKey {
value = strings.Replace(value, match, envValue, -1)
break
}
}
}
return value, nil
}
func (b *buildFile) CmdEnv(args string) error { func (b *buildFile) CmdEnv(args string) error {
tmp := strings.SplitN(args, " ", 2) tmp := strings.SplitN(args, " ", 2)
if len(tmp) != 2 { if len(tmp) != 2 {
@ -120,14 +158,19 @@ func (b *buildFile) CmdEnv(args string) error {
key := strings.Trim(tmp[0], " \t") key := strings.Trim(tmp[0], " \t")
value := strings.Trim(tmp[1], " \t") value := strings.Trim(tmp[1], " \t")
for i, elem := range b.config.Env { envKey := b.FindEnvKey(key)
if strings.HasPrefix(elem, key+"=") { replacedValue, err := b.ReplaceEnvMatches(value)
b.config.Env[i] = key + "=" + value if err != nil {
return nil return err
}
} }
b.config.Env = append(b.config.Env, key+"="+value) replacedVar := fmt.Sprintf("%s=%s", key, replacedValue)
return b.commit("", b.config.Cmd, fmt.Sprintf("ENV %s=%s", key, value))
if envKey >= 0 {
b.config.Env[envKey] = replacedVar
return nil
}
b.config.Env = append(b.config.Env, replacedVar)
return b.commit("", b.config.Cmd, fmt.Sprintf("ENV %s", replacedVar))
} }
func (b *buildFile) CmdCmd(args string) error { func (b *buildFile) CmdCmd(args string) error {
@ -260,8 +303,16 @@ func (b *buildFile) CmdAdd(args string) error {
if len(tmp) != 2 { if len(tmp) != 2 {
return fmt.Errorf("Invalid ADD format") return fmt.Errorf("Invalid ADD format")
} }
orig := strings.Trim(tmp[0], " \t")
dest := strings.Trim(tmp[1], " \t") orig, err := b.ReplaceEnvMatches(strings.Trim(tmp[0], " \t"))
if err != nil {
return err
}
dest, err := b.ReplaceEnvMatches(strings.Trim(tmp[1], " \t"))
if err != nil {
return err
}
cmd := b.config.Cmd cmd := b.config.Cmd
b.config.Cmd = []string{"/bin/sh", "-c", fmt.Sprintf("#(nop) ADD %s in %s", orig, dest)} b.config.Cmd = []string{"/bin/sh", "-c", fmt.Sprintf("#(nop) ADD %s in %s", orig, dest)}

View file

@ -129,6 +129,38 @@ CMD Hello world
nil, nil,
nil, nil,
}, },
{
`
from {IMAGE}
env FOO /foo/baz
env BAR /bar
env BAZ $BAR
env FOOPATH $PATH:$FOO
run [ "$BAR" = "$BAZ" ]
run [ "$FOOPATH" = "$PATH:/foo/baz" ]
`,
nil,
nil,
},
{
`
from {IMAGE}
env FOO /bar
env TEST testdir
env BAZ /foobar
add testfile $BAZ/
add $TEST $FOO
run [ "$(cat /foobar/testfile)" = "test1" ]
run [ "$(cat /bar/withfile)" = "test2" ]
`,
[][2]string{
{"testfile", "test1"},
{"testdir/withfile", "test2"},
},
nil,
},
} }
// FIXME: test building with 2 successive overlapping ADD commands // FIXME: test building with 2 successive overlapping ADD commands
@ -242,8 +274,14 @@ func TestBuildEnv(t *testing.T) {
env port 4243 env port 4243
`, `,
nil, nil}, t) nil, nil}, t)
hasEnv := false
if img.Config.Env[0] != "port=4243" { for _, envVar := range img.Config.Env {
if envVar == "port=4243" {
hasEnv = true
break
}
}
if !hasEnv {
t.Fail() t.Fail()
} }
} }

View file

@ -611,11 +611,11 @@ type JSONMessage struct {
Status string `json:"status,omitempty"` Status string `json:"status,omitempty"`
Progress string `json:"progress,omitempty"` Progress string `json:"progress,omitempty"`
Error string `json:"error,omitempty"` Error string `json:"error,omitempty"`
ID string `json:"id,omitempty"` ID string `json:"id,omitempty"`
Time int64 `json:"time,omitempty"` Time int64 `json:"time,omitempty"`
} }
func (jm *JSONMessage) Display(out io.Writer) (error) { func (jm *JSONMessage) Display(out io.Writer) error {
if jm.Time != 0 { if jm.Time != 0 {
fmt.Fprintf(out, "[%s] ", time.Unix(jm.Time, 0)) fmt.Fprintf(out, "[%s] ", time.Unix(jm.Time, 0))
} }
@ -631,7 +631,6 @@ func (jm *JSONMessage) Display(out io.Writer) (error) {
return nil return nil
} }
type StreamFormatter struct { type StreamFormatter struct {
json bool json bool
used bool used bool