- Notifications
You must be signed in to change notification settings - Fork2.2k
libcontainer/configs/config: Clear hook environ variables on empty Env#1738
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Uh oh!
There was an error while loading.Please reload this page.
Conversation
libcontainer/configs/config.go Outdated
| Stderr:&stderr, | ||
| } | ||
| ifcmd.Env==nil { | ||
| cmd.Env= []string{"_GO_DOES_NOT_PROVIDE_A_WAY_TO_CLEAR_ENV="} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Doescmd.Env = []string{} also not work?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
justincormack commentedFeb 27, 2018 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
Why can't you just set it to Ah sorry, was mislead by the comments above it has been changed to do this. |
wking commentedFeb 27, 2018
I've updated the initial comment to avoid misleading others. |
This shifts the matching logic out of libpod/container_internal andinto the hook package, where we can reuse it after vendoring intoCRI-O. It also adds unit tests with almost-complete coverage. Nowlibpod is even more isolated from the hook internals, which makes itfairly straightforward to bump the hook config file to 1.0.0. I'vedubbed the old format 0.1.0, although it doesn't specify an explicitversion. Motivation for some of my changes with 1.0.0:* Add an explicit version field. This will make any future JSON structure migrations more straightforward by avoiding the need for version-guessing heuristics.* Collect the matching properties in a new When sub-structure. This makes the root Hook structure easier to understand, because you don't have to read over all the matching properties when wrapping your head around Hook.* Replace the old 'hook' and 'arguments' with a direct embedding of the runtime-spec's hook structure. This provides access to additional upstream properties (args[0], env, and timeout) and avoids the complication of a CRI-O-specific analog structure.* Add a 'when.always' property. You can usually accomplish this effect in another way (e.g. when.commands = [".*"]), but having a boolean explicitly for this use-case makes for easier reading and writing.* Replace the previous annotations array with an annotations map. The 0.1.0 approach matched only the values regardless of key, and that seems unreliable.* Replace 'cmds' with 'when.commands', because while there are a few ways to abbreviate "commands", there's only one way to write it out in full ;). This gives folks one less thing to remember when writing hook JSON.* Replace the old "inject if any specified condition matches" with "inject if all specified conditions match". This allows for more precise targeting. Users that need more generous targeting can recover the previous behavior by creating a separate 1.0.0 hook file for each specified 0.1.0 condition.I've added doc-compat support for the various pluralizations of the0.1.0 properties. Previously, the docs and code were not inagreement. More on this particular facet in [1].I've updated the docs to point out that the annotations being matchedare the OCI config annotations. This differs from CRI-O, where theannotations used are the Kubernetes-supplied annotations [2,3]. Forexample, io.kubernetes.cri-o.Volumes [4] is part of CRI-O's runtimeconfig annotations [5], but not part of the Kubernetes-suppliedannotations CRI-O uses for matching hooks.The Monitor method supports the CRI-O use-case [6]. podman doesn'tneed it directly, but CRI-O will need it when we vendor this packagethere.I've used nvidia-container-runtime-hook for the annotation examplesbecause Dan mentioned the Nvidia folks as the motivation behindannotation matching. The environment variables are documented in [7].The 0.1.0 hook config, which does not allow for environment variables,only works because runc currently leaks the host environment into thehooks [8]. I haven't been able to find documentation for their usualannotation trigger or hook-install path, so I'm just guessing there.[1]:cri-o/cri-o#1235[2]:https://github.com/kubernetes-incubator/cri-o/blob/v1.10.0/server/container_create.go#L760[3]:https://github.com/kubernetes-incubator/cri-o/blob/v1.10.0/server/container_create.go#L772[4]:https://github.com/kubernetes-incubator/cri-o/blob/v1.10.0/pkg/annotations/annotations.go#L97-L98[5]:https://github.com/kubernetes-incubator/cri-o/blob/v1.10.0/server/container_create.go#L830-L834[6]:cri-o/cri-o#1345[7]:https://github.com/NVIDIA/nvidia-container-runtime/tree/v1.3.0-1#environment-variables-oci-spec[8]:opencontainers/runc#1738Signed-off-by: W. Trevor King <wking@tremily.us>
This shifts the matching logic out of libpod/container_internal andinto the hook package, where we can reuse it after vendoring intoCRI-O. It also adds unit tests with almost-complete coverage. Nowlibpod is even more isolated from the hook internals, which makes itfairly straightforward to bump the hook config file to 1.0.0. I'vedubbed the old format 0.1.0, although it doesn't specify an explicitversion. Motivation for some of my changes with 1.0.0:* Add an explicit version field. This will make any future JSON structure migrations more straightforward by avoiding the need for version-guessing heuristics.* Collect the matching properties in a new When sub-structure. This makes the root Hook structure easier to understand, because you don't have to read over all the matching properties when wrapping your head around Hook.* Replace the old 'hook' and 'arguments' with a direct embedding of the runtime-spec's hook structure. This provides access to additional upstream properties (args[0], env, and timeout) and avoids the complication of a CRI-O-specific analog structure.* Add a 'when.always' property. You can usually accomplish this effect in another way (e.g. when.commands = [".*"]), but having a boolean explicitly for this use-case makes for easier reading and writing.* Replace the previous annotations array with an annotations map. The 0.1.0 approach matched only the values regardless of key, and that seems unreliable.* Replace 'cmds' with 'when.commands', because while there are a few ways to abbreviate "commands", there's only one way to write it out in full ;). This gives folks one less thing to remember when writing hook JSON.* Replace the old "inject if any specified condition matches" with "inject if all specified conditions match". This allows for more precise targeting. Users that need more generous targeting can recover the previous behavior by creating a separate 1.0.0 hook file for each specified 0.1.0 condition.I've added doc-compat support for the various pluralizations of the0.1.0 properties. Previously, the docs and code were not inagreement. More on this particular facet in [1].I've updated the docs to point out that the annotations being matchedare the OCI config annotations. This differs from CRI-O, where theannotations used are the Kubernetes-supplied annotations [2,3]. Forexample, io.kubernetes.cri-o.Volumes [4] is part of CRI-O's runtimeconfig annotations [5], but not part of the Kubernetes-suppliedannotations CRI-O uses for matching hooks.The Monitor method supports the CRI-O use-case [6]. podman doesn'tneed it directly, but CRI-O will need it when we vendor this packagethere.I've used nvidia-container-runtime-hook for the annotation examplesbecause Dan mentioned the Nvidia folks as the motivation behindannotation matching. The environment variables are documented in [7].The 0.1.0 hook config, which does not allow for environment variables,only works because runc currently leaks the host environment into thehooks [8]. I haven't been able to find documentation for their usualannotation trigger or hook-install path, so I'm just guessing there.[1]:cri-o/cri-o#1235[2]:https://github.com/kubernetes-incubator/cri-o/blob/v1.10.0/server/container_create.go#L760[3]:https://github.com/kubernetes-incubator/cri-o/blob/v1.10.0/server/container_create.go#L772[4]:https://github.com/kubernetes-incubator/cri-o/blob/v1.10.0/pkg/annotations/annotations.go#L97-L98[5]:https://github.com/kubernetes-incubator/cri-o/blob/v1.10.0/server/container_create.go#L830-L834[6]:cri-o/cri-o#1345[7]:https://github.com/NVIDIA/nvidia-container-runtime/tree/v1.3.0-1#environment-variables-oci-spec[8]:opencontainers/runc#1738Signed-off-by: W. Trevor King <wking@tremily.us>Closes:#686Approved by: mheon
kolyshkin commentedJun 15, 2024
This makes sense but needs a test case (in e.g. |
The runtime spec has [1]: * env (array of strings, OPTIONAL) with the same semantics as IEEE Std 1003.1-2008's environ.And running execle or similar with NULL env results in an emptyenvironent: $ cat test.c #include <unistd.h> int main() { return execle("/usr/bin/env", "env", NULL, NULL); } $ cc -o test test.c $ ./test ...no output...Go's Cmd.Env, on the other hand, has [2]: If Env is nil, the new process uses the current process's environment.This commit works around that by setting Env to an empty slice inthose cases to avoid leaking the runtime environment into the hooks.[1]:https://github.com/opencontainers/runtime-spec/blob/v1.0.1/config.md#posix-platform-hooks[2]:https://golang.org/pkg/os/exec/#CmdSigned-off-by: W. Trevor King <wking@tremily.us>lifubang commentedJun 19, 2024
Carried in#4323 |
kolyshkin commentedJun 23, 2024
Closing in favor of#4323 |
Uh oh!
There was an error while loading.Please reload this page.
The runtime spechas:
And running
execleor similar withNULLenvresults in an empty environent:Go's
Cmd.Env, on the other hand, has:This commit works around that by setting
a single dummy environment variable[]string{}in those cases to avoid leaking the runtime environment into the hooks.