summaryrefslogtreecommitdiff
path: root/pkg/systemd/generate/containers.go
diff options
context:
space:
mode:
authorPaul Holzinger <paul.holzinger@web.de>2021-05-05 22:51:23 +0200
committerPaul Holzinger <paul.holzinger@web.de>2021-05-10 12:01:24 +0200
commit77e6ae24369e6c7bed85141ae6f7d0c7b0e26c0b (patch)
tree99c84def2231d9baad798e298fdf79feba0b7c49 /pkg/systemd/generate/containers.go
parent54bed1025d07bc5f77ee4e1e7f942157e211ec0a (diff)
downloadpodman-77e6ae24369e6c7bed85141ae6f7d0c7b0e26c0b.tar.gz
podman-77e6ae24369e6c7bed85141ae6f7d0c7b0e26c0b.tar.bz2
podman-77e6ae24369e6c7bed85141ae6f7d0c7b0e26c0b.zip
Add envars to the generated systemd unit
The with --new generated systemd unit loses the environment variables when the create command only contains the key without the value. Since podman tries to lookup those values from the environment the unit can fail. This commits ensures that we will add the environment variables to the unit file when this is the case. The container environment variables are looked up in the container spec. Fixes #10101 Signed-off-by: Paul Holzinger <paul.holzinger@web.de>
Diffstat (limited to 'pkg/systemd/generate/containers.go')
-rw-r--r--pkg/systemd/generate/containers.go31
1 files changed, 31 insertions, 0 deletions
diff --git a/pkg/systemd/generate/containers.go b/pkg/systemd/generate/containers.go
index e06655a8d..eb1fb67ff 100644
--- a/pkg/systemd/generate/containers.go
+++ b/pkg/systemd/generate/containers.go
@@ -54,6 +54,12 @@ type containerInfo struct {
// CreateCommand is the full command plus arguments of the process the
// container has been created with.
CreateCommand []string
+ // containerEnv stores the container environment variables
+ containerEnv []string
+ // ExtraEnvs contains the container environment variables referenced
+ // by only the key in the container create command, e.g. --env FOO.
+ // This is only used with --new
+ ExtraEnvs []string
// EnvVariable is generate.EnvVariable and must not be set.
EnvVariable string
// ExecStartPre of the unit.
@@ -87,6 +93,9 @@ After={{{{- range $index, $value := .BoundToServices -}}}}{{{{if $index}}}} {{{{
[Service]
Environment={{{{.EnvVariable}}}}=%n
+{{{{- if .ExtraEnvs}}}}
+Environment={{{{- range $index, $value := .ExtraEnvs -}}}}{{{{if $index}}}} {{{{end}}}}{{{{ $value }}}}{{{{end}}}}
+{{{{- end}}}}
Restart={{{{.RestartPolicy}}}}
TimeoutStopSec={{{{.TimeoutStopSec}}}}
{{{{- if .ExecStartPre}}}}
@@ -153,6 +162,8 @@ func generateContainerInfo(ctr *libpod.Container, options entities.GenerateSyste
return nil, errors.Errorf("could not lookup container's runroot: got empty string")
}
+ envs := config.Spec.Process.Env
+
info := containerInfo{
ServiceName: serviceName,
ContainerNameOrID: nameOrID,
@@ -163,6 +174,7 @@ func generateContainerInfo(ctr *libpod.Container, options entities.GenerateSyste
CreateCommand: createCommand,
GraphRoot: graphRoot,
RunRoot: runRoot,
+ containerEnv: envs,
}
return &info, nil
@@ -248,6 +260,7 @@ func executeContainerTemplate(info *containerInfo, options entities.GenerateSyst
fs.BoolP("detach", "d", false, "")
fs.String("name", "", "")
fs.Bool("replace", false, "")
+ fs.StringArrayP("env", "e", nil, "")
fs.Parse(remainingCmd)
remainingCmd = filterCommonContainerFlags(remainingCmd, fs.NArg())
@@ -304,6 +317,24 @@ func executeContainerTemplate(info *containerInfo, options entities.GenerateSyst
remainingCmd = removeReplaceArg(remainingCmd, fs.NArg())
}
}
+
+ envs, err := fs.GetStringArray("env")
+ if err != nil {
+ return "", err
+ }
+ for _, env := range envs {
+ // if env arg does not contain a equal sign we have to add the envar to the unit
+ // because it does try to red the value from the environment
+ if !strings.Contains(env, "=") {
+ for _, containerEnv := range info.containerEnv {
+ split := strings.SplitN(containerEnv, "=", 2)
+ if split[0] == env {
+ info.ExtraEnvs = append(info.ExtraEnvs, escapeSystemdArg(containerEnv))
+ }
+ }
+ }
+ }
+
startCommand = append(startCommand, remainingCmd...)
startCommand = escapeSystemdArguments(startCommand)