mirror of
https://github.com/containers/podman.git
synced 2025-05-29 14:06:29 +08:00
Merge pull request #15434 from rhatdan/manifest1
Allow podman to run in an environment with keys containing spaces
This commit is contained in:
20
pkg/env/env.go
vendored
20
pkg/env/env.go
vendored
@ -37,6 +37,22 @@ func Slice(m map[string]string) []string {
|
||||
return env
|
||||
}
|
||||
|
||||
// Map transforms the specified slice of environment variables into a
|
||||
// map.
|
||||
func Map(slice []string) map[string]string {
|
||||
envmap := make(map[string]string, len(slice))
|
||||
for _, val := range slice {
|
||||
data := strings.SplitN(val, "=", 2)
|
||||
|
||||
if len(data) > 1 {
|
||||
envmap[data[0]] = data[1]
|
||||
} else {
|
||||
envmap[data[0]] = ""
|
||||
}
|
||||
}
|
||||
return envmap
|
||||
}
|
||||
|
||||
// Join joins the two environment maps with override overriding base.
|
||||
func Join(base map[string]string, override map[string]string) map[string]string {
|
||||
if len(base) == 0 {
|
||||
@ -87,10 +103,6 @@ func parseEnv(env map[string]string, line string) error {
|
||||
}
|
||||
// trim the front of a variable, but nothing else
|
||||
name := strings.TrimLeft(data[0], whiteSpaces)
|
||||
if strings.ContainsAny(name, whiteSpaces) {
|
||||
return fmt.Errorf("name %q has white spaces, poorly formatted name", name)
|
||||
}
|
||||
|
||||
if len(data) > 1 {
|
||||
env[name] = data[1]
|
||||
} else {
|
||||
|
@ -152,10 +152,8 @@ func CompleteSpec(ctx context.Context, r *libpod.Runtime, s *specgen.SpecGenerat
|
||||
}
|
||||
// First transform the os env into a map. We need it for the labels later in
|
||||
// any case.
|
||||
osEnv, err := envLib.ParseSlice(os.Environ())
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error parsing host environment variables: %w", err)
|
||||
}
|
||||
osEnv := envLib.Map(os.Environ())
|
||||
|
||||
// Caller Specified defaults
|
||||
if s.EnvHost {
|
||||
defaultEnvs = envLib.Join(defaultEnvs, osEnv)
|
||||
|
@ -362,10 +362,7 @@ func FillOutSpecGen(s *specgen.SpecGenerator, c *entities.ContainerCreateOptions
|
||||
|
||||
// First transform the os env into a map. We need it for the labels later in
|
||||
// any case.
|
||||
osEnv, err := envLib.ParseSlice(os.Environ())
|
||||
if err != nil {
|
||||
return fmt.Errorf("error parsing host environment variables: %w", err)
|
||||
}
|
||||
osEnv := envLib.Map(os.Environ())
|
||||
|
||||
if !s.EnvHost {
|
||||
s.EnvHost = c.EnvHost
|
||||
|
@ -58,6 +58,13 @@ var _ = Describe("Podman run", func() {
|
||||
Expect(session).Should(Exit(0))
|
||||
Expect(session.OutputToString()).To(ContainSubstring("/bin"))
|
||||
|
||||
// Verify environ keys with spaces do not blow up podman command
|
||||
os.Setenv("FOO BAR", "BAZ")
|
||||
session = podmanTest.Podman([]string{"run", "--rm", ALPINE, "true"})
|
||||
session.WaitWithDefaultTimeout()
|
||||
Expect(session).Should(Exit(0))
|
||||
os.Unsetenv("FOO BAR")
|
||||
|
||||
os.Setenv("FOO", "BAR")
|
||||
session = podmanTest.Podman([]string{"run", "--rm", "--env", "FOO", ALPINE, "printenv", "FOO"})
|
||||
session.WaitWithDefaultTimeout()
|
||||
|
Reference in New Issue
Block a user