mirror of
https://github.com/containers/podman.git
synced 2025-08-06 19:44:14 +08:00
Merge pull request #12100 from rhatdan/env
Add option --unsetenv to remove default environment variables
This commit is contained in:
@ -201,6 +201,20 @@ func DefineCreateFlags(cmd *cobra.Command, cf *entities.ContainerCreateOptions,
|
||||
)
|
||||
_ = cmd.RegisterFlagCompletionFunc(envFlagName, completion.AutocompleteNone)
|
||||
|
||||
unsetenvFlagName := "unsetenv"
|
||||
createFlags.StringArrayVar(
|
||||
&cf.UnsetEnv,
|
||||
unsetenvFlagName, []string{},
|
||||
"Unset environment default variables in container",
|
||||
)
|
||||
_ = cmd.RegisterFlagCompletionFunc(unsetenvFlagName, completion.AutocompleteNone)
|
||||
|
||||
createFlags.BoolVar(
|
||||
&cf.UnsetEnvAll,
|
||||
"unsetenv-all", false,
|
||||
"Unset all default environment variables in container",
|
||||
)
|
||||
|
||||
if !registry.IsRemote() {
|
||||
createFlags.BoolVar(
|
||||
&cf.EnvHost,
|
||||
|
@ -297,6 +297,8 @@ func ContainerCreateToContainerCLIOpts(cc handlers.CreateContainerConfig, rtc *c
|
||||
Systemd: "true", // podman default
|
||||
TmpFS: parsedTmp,
|
||||
TTY: cc.Config.Tty,
|
||||
UnsetEnv: cc.UnsetEnv,
|
||||
UnsetEnvAll: cc.UnsetEnvAll,
|
||||
User: cc.Config.User,
|
||||
UserNS: string(cc.HostConfig.UsernsMode),
|
||||
UTS: string(cc.HostConfig.UTSMode),
|
||||
|
@ -1047,6 +1047,18 @@ Remote connections use local containers.conf for defaults
|
||||
Set the umask inside the container. Defaults to `0022`.
|
||||
Remote connections use local containers.conf for defaults
|
||||
|
||||
#### **--unsetenv**=*env*
|
||||
|
||||
Unset default environment variables for the container. Default environment
|
||||
variables include variables provided natively by Podman, environment variables
|
||||
configured by the image, and environment variables from containers.conf.
|
||||
|
||||
#### **--unsetenv-all**=*true|false*
|
||||
|
||||
Unset all default environment variables for the container. Default environment
|
||||
variables include variables provided natively by Podman, environment variables
|
||||
configured by the image, and environment variables from containers.conf.
|
||||
|
||||
#### **--uidmap**=*container_uid*:*from_uid*:*amount*
|
||||
|
||||
Run the container in a new user namespace using the supplied mapping. This
|
||||
|
@ -1117,6 +1117,18 @@ Remote connections use local containers.conf for defaults
|
||||
Set the umask inside the container. Defaults to `0022`.
|
||||
Remote connections use local containers.conf for defaults
|
||||
|
||||
#### **--unsetenv**=*env*
|
||||
|
||||
Unset default environment variables for the container. Default environment
|
||||
variables include variables provided natively by Podman, environment variables
|
||||
configured by the image, and environment variables from containers.conf.
|
||||
|
||||
#### **--unsetenv-all**=*true|false*
|
||||
|
||||
Unset all default environment variables for the container. Default environment
|
||||
variables include variables provided natively by Podman, environment variables
|
||||
configured by the image, and environment variables from containers.conf.
|
||||
|
||||
#### **--uidmap**=*container_uid*:*from_uid*:*amount*
|
||||
|
||||
Run the container in a new user namespace using the supplied mapping. This
|
||||
|
@ -300,8 +300,7 @@ func (c *Container) generateInspectContainerConfig(spec *spec.Spec) *define.Insp
|
||||
ctrConfig.User = c.config.User
|
||||
if spec.Process != nil {
|
||||
ctrConfig.Tty = spec.Process.Terminal
|
||||
ctrConfig.Env = []string{}
|
||||
ctrConfig.Env = append(ctrConfig.Env, spec.Process.Env...)
|
||||
ctrConfig.Env = append([]string{}, spec.Process.Env...)
|
||||
ctrConfig.WorkingDir = spec.Process.Cwd
|
||||
}
|
||||
|
||||
|
@ -709,18 +709,6 @@ func (c *Container) generateSpec(ctx context.Context) (*spec.Spec, error) {
|
||||
g.AddAnnotation(annotations.ContainerManager, annotations.ContainerManagerLibpod)
|
||||
}
|
||||
|
||||
// Only add container environment variable if not already present
|
||||
foundContainerEnv := false
|
||||
for _, env := range g.Config.Process.Env {
|
||||
if strings.HasPrefix(env, "container=") {
|
||||
foundContainerEnv = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !foundContainerEnv {
|
||||
g.AddProcessEnv("container", "libpod")
|
||||
}
|
||||
|
||||
cgroupPath, err := c.getOCICgroupPath()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -116,6 +116,8 @@ type CreateContainerConfig struct {
|
||||
dockerContainer.Config // desired container configuration
|
||||
HostConfig dockerContainer.HostConfig // host dependent configuration for container
|
||||
NetworkingConfig dockerNetwork.NetworkingConfig // network configuration for container
|
||||
UnsetEnv []string // unset specified default environment variables
|
||||
UnsetEnvAll bool // unset all default environment variables
|
||||
}
|
||||
|
||||
// swagger:model IDResponse
|
||||
|
@ -248,6 +248,8 @@ type ContainerCreateOptions struct {
|
||||
TTY bool
|
||||
Timezone string
|
||||
Umask string
|
||||
UnsetEnv []string
|
||||
UnsetEnvAll bool
|
||||
UIDMap []string
|
||||
Ulimit []string
|
||||
User string
|
||||
|
@ -88,9 +88,6 @@ func CompleteSpec(ctx context.Context, r *libpod.Runtime, s *specgen.SpecGenerat
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "error parsing fields in containers.conf")
|
||||
}
|
||||
if defaultEnvs["container"] == "" {
|
||||
defaultEnvs["container"] = "podman"
|
||||
}
|
||||
var envs map[string]string
|
||||
|
||||
// Image Environment defaults
|
||||
@ -101,9 +98,16 @@ func CompleteSpec(ctx context.Context, r *libpod.Runtime, s *specgen.SpecGenerat
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "Env fields from image failed to parse")
|
||||
}
|
||||
defaultEnvs = envLib.Join(defaultEnvs, envs)
|
||||
defaultEnvs = envLib.Join(envLib.DefaultEnvVariables(), envLib.Join(defaultEnvs, envs))
|
||||
}
|
||||
|
||||
for _, e := range s.UnsetEnv {
|
||||
delete(defaultEnvs, e)
|
||||
}
|
||||
|
||||
if s.UnsetEnvAll {
|
||||
defaultEnvs = make(map[string]string)
|
||||
}
|
||||
// First transform the os env into a map. We need it for the labels later in
|
||||
// any case.
|
||||
osEnv, err := envLib.ParseSlice(os.Environ())
|
||||
|
@ -298,7 +298,6 @@ func SpecGenToOCI(ctx context.Context, s *specgen.SpecGenerator, rt *libpod.Runt
|
||||
for key, val := range s.Annotations {
|
||||
g.AddAnnotation(key, val)
|
||||
}
|
||||
g.AddProcessEnv("container", "podman")
|
||||
|
||||
g.Config.Linux.Resources = s.ResourceLimits
|
||||
// Devices
|
||||
@ -332,6 +331,7 @@ func SpecGenToOCI(ctx context.Context, s *specgen.SpecGenerator, rt *libpod.Runt
|
||||
|
||||
BlockAccessToKernelFilesystems(s.Privileged, s.PidNS.IsHost(), s.Mask, s.Unmask, &g)
|
||||
|
||||
g.ClearProcessEnv()
|
||||
for name, val := range s.Env {
|
||||
g.AddProcessEnv(name, val)
|
||||
}
|
||||
|
@ -194,6 +194,13 @@ type ContainerBasicConfig struct {
|
||||
// The execution domain system allows Linux to provide limited support
|
||||
// for binaries compiled under other UNIX-like operating systems.
|
||||
Personality *spec.LinuxPersonality `json:"personality,omitempty"`
|
||||
// UnsetEnv unsets the specified default environment variables from the image or from buildin or containers.conf
|
||||
// Optional.
|
||||
UnsetEnv []string `json:"unsetenv,omitempty"`
|
||||
// UnsetEnvAll unsetall default environment variables from the image or from buildin or containers.conf
|
||||
// UnsetEnvAll unsets all default environment variables from the image or from buildin
|
||||
// Optional.
|
||||
UnsetEnvAll bool `json:"unsetenvall,omitempty"`
|
||||
}
|
||||
|
||||
// ContainerStorageConfig contains information on the storage configuration of a
|
||||
|
@ -711,6 +711,8 @@ func FillOutSpecGen(s *specgen.SpecGenerator, c *entities.ContainerCreateOptions
|
||||
s.Umask = c.Umask
|
||||
s.PidFile = c.PidFile
|
||||
s.Volatile = c.Rm
|
||||
s.UnsetEnv = c.UnsetEnv
|
||||
s.UnsetEnvAll = c.UnsetEnvAll
|
||||
|
||||
// Initcontainers
|
||||
s.InitContainerType = c.InitContainerType
|
||||
|
@ -736,4 +736,26 @@ EOF
|
||||
is "$output" "$random_1" "output matches STDIN"
|
||||
}
|
||||
|
||||
@test "podman run defaultenv" {
|
||||
run_podman run --rm $IMAGE printenv
|
||||
is "$output" ".*TERM=xterm" "output matches TERM"
|
||||
is "$output" ".*container=podman" "output matches container=podman"
|
||||
|
||||
run_podman run --unsetenv=TERM --rm $IMAGE printenv
|
||||
is "$output" ".*container=podman" "output matches container=podman"
|
||||
run grep TERM <<<$output
|
||||
is "$output" "" "unwanted TERM environment variable despite --unsetenv=TERM"
|
||||
|
||||
run_podman run --unsetenv-all --rm $IMAGE /bin/printenv
|
||||
run grep TERM <<<$output
|
||||
is "$output" "" "unwanted TERM environment variable despite --unsetenv-all"
|
||||
run grep container <<<$output
|
||||
is "$output" "" "unwanted container environment variable despite --unsetenv-all"
|
||||
run grep PATH <<<$output
|
||||
is "$output" "" "unwanted PATH environment variable despite --unsetenv-all"
|
||||
|
||||
run_podman run --unsetenv-all --env TERM=abc --rm $IMAGE /bin/printenv
|
||||
is "$output" ".*TERM=abc" "missing TERM environment variable despite TERM being set on commandline"
|
||||
}
|
||||
|
||||
# vim: filetype=sh
|
||||
|
@ -174,10 +174,14 @@ function check_listen_env() {
|
||||
if is_remote; then
|
||||
is "$output" "$stdenv" "LISTEN Environment did not pass: $context"
|
||||
else
|
||||
is "$output" "$stdenv
|
||||
out=$(for o in $output; do echo $o; done| sort)
|
||||
std=$(echo "$stdenv
|
||||
LISTEN_PID=1
|
||||
LISTEN_FDS=1
|
||||
LISTEN_FDNAMES=listen_fdnames" "LISTEN Environment passed: $context"
|
||||
LISTEN_FDNAMES=listen_fdnames" | sort)
|
||||
echo "<$out>"
|
||||
echo "<$std>"
|
||||
is "$out" "$std" "LISTEN Environment passed: $context"
|
||||
fi
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user