Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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

Closed
wking wants to merge1 commit intoopencontainers:mainfromwking:hook-clear-env

Conversation

@wking
Copy link
Contributor

@wkingwking commentedFeb 24, 2018
edited
Loading

The runtime spechas:

  • env (array of strings, OPTIONAL) with the same semantics as IEEE Std 1003.1-2008's environ.

And runningexecle or similar withNULLenv results in an empty environent:

$cat test.c#include <unistd.h>int main(){  return execle("/usr/bin/env", "env", NULL, NULL);}$cc -otest test.c$./test…no output…

Go'sCmd.Env, on the other hand, has:

If Env is nil, the new process uses the current process's environment.

This commit works around that by settinga single dummy environment variable[]string{} in those cases to avoid leaking the runtime environment into the hooks.

RenaudWasTaken reacted with thumbs up emoji
Stderr:&stderr,
}
ifcmd.Env==nil {
cmd.Env= []string{"_GO_DOES_NOT_PROVIDE_A_WAY_TO_CLEAR_ENV="}
Copy link
Member

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?

crosbymichael reacted with confused emoji
Copy link
ContributorAuthor

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?

Looks likeit does :). Fixed with5f6ed8496e8770.

@justincormack
Copy link
Contributor

justincormack commentedFeb 27, 2018
edited
Loading

Why can't you just set it to[]string{} which will give the desired outcome if the passed array is nil?

Ah sorry, was mislead by the comments above it has been changed to do this.

@wking
Copy link
ContributorAuthor

Ah sorry, was mislead by the comments above...

I've updated the initial comment to avoid misleading others.

wking added a commit to wking/libpod that referenced this pull requestMay 11, 2018
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>
rh-atomic-bot pushed a commit to containers/podman that referenced this pull requestMay 11, 2018
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
Copy link
Contributor

This makes sense but needs a test case (in e.g.tests/integration/hooks.bats)

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
Copy link
Member

Carried in#4323

@kolyshkin
Copy link
Contributor

Closing in favor of#4323

Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment

Reviewers

@cypharcypharcyphar left review comments

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

5 participants

@wking@justincormack@kolyshkin@lifubang@cyphar

[8]ページ先頭

©2009-2025 Movatter.jp